Questa pagina l'ho scritta molto tempo fa e contiene materiale obsoleto
L'uso è sconsigliato e non posso più fornire alcun supporto
Raspberry PI è dotato di una porta seriale compatibile a livello logico (ma non elettrico!) con l'interfaccia seriale RS-232.
I progettisti di Raspberry Pi hanno pensato tale interfaccia per collegare un terminale seriale. Nella foto seguente è mostrata la sequenza di boot e la richiesta di login, utilizzando un adattatore bluetooth, un telefono android ed un software di emulazione terminale (nello specifico BlueTerm).
Il modulo seriale è già configurato di default; ha due scopi:
Per evitare i messaggi di output è necessario editare come root il file /boot/cmdline.txt e rimuovere tutti i riferimento a ttyAMA0 (il nome dell'interfaccia seriale). In rosso la parte da togliere:
vv@vvrpi ~ $ cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=ttyAMA0,115200
kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2
rootfstype=ext4 elevator=deadline rootwait
Per disattivare il login è necessario, sempre come root, editare il file /etc/inittab e commentare/rimuovere la riga evidenziata di seguito:
vv@vvrpi ~ $ cat /etc/inittab
#Spawn a getty on Raspberry Pi serial line
#T0:23:respawn:/sbin/getty -L ttyAMA0
115200 vt100
Da verificare l'utente che intendete utilizzare appartenga ai gruppi tty e/o dialout. Altrimenti è necessario aggiungerlo:
vv@vvrpi ~ $ sudo usermod -a -G tty vv
vv@vvrpi ~ $ sudo usermod -a -G dialout vv
Dopo le modifiche occorre riavviare.
Per configurare la porta seriale è possibile usare il comando stty. La descrizione delle tante opzioni è presente nel man. Per cominciare bastano un paio di esempi:
Per vedere le impostazioni correnti è sufficiente specificare il nome dell'interfaccia
vv@vvrpi ~ $ stty -F /dev/ttyAMA0
speed 9600 baud; line = 0;
lnext = <undef>; min = 1; time = 0;
-brkint -icrnl ixoff -imaxbel
-icanon -iexten -echo
Per impostare i parametri è sufficiente specificarli sulla linea di comando. Per esempio, per specificare la velocità di 115 200 bit/s il comando è:
vv@vvrpi ~ $ stty -F /dev/ttyAMA0 115200
vv@vvrpi ~ $ stty -F /dev/ttyAMA0
speed 115200 baud; [...]
Le opzioni più impostanti:
L'hardware è semplicissimo: un filo che collega direttamente RxD con TxD (GPIO14 e GPIO15. pin 8 e 10).
Preliminarmente occorre disattivare la console, per evitare interferenze. Occorre quindi configurare la tty:
vv@vvrpi ~ $ stty -F /dev/ttyAMA0 -echo -onlcr
A questo punto apriamo due terminali, uno per leggere ed uno per scrivere. Dal primo terminale predisponiamoci a leggere quanto ricevuto:
vv@vvrpi ~ $ cat /dev/ttyAMA0
Dal secondo scriviamo qualcosa verso la seriale:
vv@vvrpi ~ $ echo "Questo è un test" > /dev/ttyAMA0
Se tutto ha funzionato correttamente, sul primo terminale dovrà apparire la frase trasmessa.
In alternativa potete usare minicom:
vv@vvrpi ~ $ sudo aptitude install minicom
vv@vvrpi ~ $ minicom -b 115200 -D /dev/ttyAMA0
Di seguito è mostrato il segnale relativo alla trasmissione di tre byte a 9 600 bit al secondo. I comandi:
vv@vvrpi ~ $ stty -F /dev/ttyAMA0 9600 cstopb cs8
vv@vvrpi ~ $ echo -n -e '\x0A\x50\x01'> /dev/ttyAMA0
Possiamo fare le seguenti osservazioni:
A fondo pagina un codice di esempio che permette di trasmettere una serie di caratteri e visualizzare la risposta. Di seguito cosa viene mostrato se viene collegato un dispositivo bluetooth HC-04:
vv@vvrpi ~ $ gcc serial.c -std=gnu99 -o serial
vv@vvrpi ~ $ ./serial AT+NAMEVv-HC04
Rapsberry Pi: serial port in C - Versione 0.8 - Luglio 2014
Copyright (c) 2014, Vincenzo Villa (https://www.vincenzov.net)
Creative Commons | Attribuzione-Condividi allo stesso modo 3.0 Unported.
Creative Commons | Attribution-Share Alike 3.0 Unported
https://www.vincenzov.net/tutorial/RaspberryPi/serial.htm
Opening /dev/ttyAMA0
User data [14 bytes]: AT+NAMEVv-HC04
Data from device [9 bytes]: OKsetname
Ovviamente il codice funziona anche con il loopback: in questo caso il pacchetto ricevuto coincide ovviamente con quello trasmesso.
Osservando con attenzione il segnale trasmesso si nota che al momento dell'apertura della porta seriale appare un breve segnale a 0, poco più di 30 µs. Per esempio, nel caso di trasmissione dei due byte 0x31 0x32 a 9600 bit/s, quello che si vede con un oscilloscopio è l'immagine che segue: l'impulso basso in corrispondenza del rombo giallo non dovrebbe esistere.
Dalla documentazione presente su internet sembra si tratti di un bug del driver nel kernel di Raspbian.
Gli effetti di tale errore dipendono dalla velocità di trasmissione e dalla resistenza agli errori del dispositivo ricevente:
Nel caso del dispositivo Bluetooth HC-04 che ho usato per i test, la resistenza a comandi sbagliati è molto basse e l'unica soluzione funzionante che ho trovato è stata quella di inserire il ritardo di un secondo tra l'apertura della porta e l'effettivo invio di dati.
Scarica il codice: serial.c
Prima di creazione di questa pagina: luglio 2013
Ultima
modifica: luglio 2014
Raspberry Pi: note di hardware - Versione 1.31 - Luglio
2019
Copyright 2013-2019, Vincenzo Villa (https://www.vincenzov.net)
Quest'opera è stata rilasciata con licenza Creative Commons | Attribuzione-Condividi allo stesso modo 3.0 Unported.