Terminali seriali

Da GolemWiki.
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Golem-template-note-attention.png 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 , dove ESC [ è la sequenza di escape, 1;1 rappresentano la posizione del cursore (riga;colonna) ed H è 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 (solitamente uucp o dialout). 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"