Terminali seriali
Versione del 20 dic 2020 alle 20:17 di Giulio (discussione | contributi) (→Troubleshooting: tips per evitare che modemmanager si impicci dei device seriali)
Appunti con poco filo logico
In questa pagina sono raccolti alcuni suggerimenti da utilizzare per interfacciarsi con device embedded via seriale.
Standard di terminali
I moderni terminali UNIX fanno uso dello standard ANSI X3.64 o di una sua variante:
- ANSI X3.64: standard che implementa sequenze di escape per inviare comandi terminale remoto. Esempio: per muovere il cursore in alto a sinistra si invia
ESC [ 1 ; 1 H
, doveESC [
è la sequenza di escape,1;1
rappresentano la posizione del cursore (riga;colonna) edH
è il comando "muovi cursore". Una descrizione più estensiva delle sequenze di escape si può trovare alla relativa pagina di wikipedia. - DEC VT100: standard il cui nome deriva dal popolare terminale prodotto da DEC. È equivalente al protocollo VT102 (anch'esso prende il nome da un successivo modello di terminale, più economico ma retrocompatibile).
- xterm: commistione degli standard ANSI e VT-* largamente usato sugli emulatori di terminale Linux. Di uso comune le varianti -color e -color256 che, come suggerisce il nome, supportano le sequenze di escape per cambiare colore al testo.
- linux: altra variante ANSI compatibile, in voga sui sistemi Linux.
Identificare il proprio standard
Digitare su shell echo $TERM
per conoscere il protocollo attualmente in uso.
Quando si usa ssh, la variabile TERM viene ereditata in modo da adottare uno standard comune.
Applicativi per comunicazione seriale
- screen: multiplexer di terminali; consente anche la connessione via seriale usando la sintassi
screen /dev/ttyxx baudrate
. Supporta gli standard VT100/ANSI. Per l'uso si può far riferimento al prontuario. - minicom: programma per comunicazioni seriali. Supporta gli standard VT100/ANSI e gli escape per i colori (con l'opzione
--color=on
). Dispone inoltre di utilità per lo scambio dati quali ZMODEM, kermit, ... e per la comunicazione con modem AT. - miniterm.py: essenziale script python, non implementa gli standard VT100/ANSI ma supporta alcuni escape. Utile per dialogare con sistemi minimali o con microcontrollori.
Troubleshooting
- I caratteri da tastiera non vengono inviati e/o sono inviati insieme chiudendo il terminale
- sono attivi il controllo di flusso hardware (RTS/CTS) oppure software (XON/XOFF). Disattivare il controllo di flusso e riprovare.
- I tasti End, Home, ctrl+arrow non funzionano o restituiscono caratteri non stampabili
- editare il file
/etc/inputrc
ed aggiungere (o decommentare) le righe
# Home, End "\e[1~": beginning-of-line "\e[4~": end-of-line # Ctrl+arrow shortcuts "\e[5C": forward-word "\e[5D": backward-word "\e\e[C": forward-word "\e\e[D": backward-word "\e[1;5C": forward-word "\e[1;5D": backward-word
screen
/minicom
restituiscono errore tentando di connettersi al device, ma da root non si hanno problemi- verificare i privilegi dell'utente in uso nei confronti delle interfacce seriali. Lanciare
ls -lah /dev/tty*
per verificare i permessi e il gruppo assegnato (solitamenteuucp
odialout
). Ricordarsi di disconnettere l'utente quando si modificano le informazioni sui gruppi di appartenenza.
- Il precedente problema persiste anche con i privilegi corretti. Lanciando i comandi come utente root compaiono caratteri e comandi AT
- è probabile che sul sistema sia presente
modemmanager
, un software per il controllo di dispositivi 2G/3G/4G e modem-affini.
Disinstallarlo
# apt remove modemmanager
oppure, disabilitare il servizio systemd
# systemctl disable modemmanager # systemctl stop modemmanager
o ancora, istruire udev che la porta seriale che si sta usando *non* è un modem. Esplicitare rispettivamente il VID e il PID del dispositivo al posto di VVVV e PPPP. Queste informazioni si ottengono con lsusb
$ lsusb Bus 003 Device 002: ID VVVV:PPPP Serial port duh dah blabla Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub ... # vim /etc/udev/rules.d/99-ttyacms.rules ATTRS{idVendor}=="VVVV" ATTRS{idProduct}=="PPPP", ENV{ID_MM_DEVICE_IGNORE}="1"