La porta seriale

In fase di sviluppo Questa pagina è obsoleta In fase di sviluppo

Questa pagina va utilizzata solo se si dispone di una vecchia versione di Raspbian basata su Whezzy, indicativamente anteriore al 2016

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).

La configurazione dell'interfaccia

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:

Loopback

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

Le forme d'onda

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:

Il codice C

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.

Forma d'onda in C - Bug in pertura della porta seriale

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.

Codice C

Scarica il codice: serial.c

Prima di creazione di questa pagina: luglio 2013
Ultima modifica: luglio 2014


Licenza "Creative Commons" - Attribuzione-Condividi allo stesso modo 3.0 Unported


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima