programming linux c c++ serial rs232

Mandare dati grezzi in seriale

Solitamente, quando ho bisogno di mandare dati in seriale, uso questo comando:

stty -F /dev/ttyUSB0 speed 19200
echo -n ciao > /dev/ttyUSB0

Con il primo imposto il baudrate, con il secondo invio la stringa usando la porta seriale usb. Il -n serve a non scrivere il carattere per andare a capo. Per mandare valori non esprimibili con caratteri normali, possiamo fare così:

echo -ne "\x02CIAO\x03" > /dev/ttyUSB0

In questo caso ho mandato STX, quindi CIAO, quindi ETX.

Con la porta seriale del Raspberry Pi dovrebbe essere la stessa cosa, anche se in quel caso utilizzo il dispositivo in /dev/ttyAMA0, a cui è collegato un MAX3232 come spiegato qui.

Per qualche strano motivo che non riesco a spiegarmi, questo comando non funziona sempre! A volte si... a volte (la maggior parte) no.

Strano, ma se uso screen per fare la stessa cosa, funziona sempre:

screen /dev/ttyAMA0 19200

Quindi premo CTRL+B C I A O CTRL+C e all'altro capo arriva tutto. (Per uscire CTRL+A : e scrivo quit.

Mistero...

Non ho indagato sul perché, ma ho ottenuto lo stesso risultato scrivendo un programmino in C++ (anche se è talmente banale da sembrare C, e si può tradurre in C con poche modifiche).

Per utilizzarlo basta scrivere questo:

./serialecho /dev/ttyAMA0 19200 "02 43 49 41 4f 03"

Oppure senza spazi:

./serialecho /dev/ttyAMA0 19200 "024349414f03"

Il terzo parametro non è altro che la stringa da mandare in notazione esadecimale. In questo modo possiamo specificare byte per byte cosa deve essere scritto.

Neanche a dirlo... funziona alla grande!

Come funziona

La funzione parseData trasforma la stringa passata come parametro in un array di unsigned char. Lo fa leggendo le coppie di caratteri e saltando gli spazi.

Nel main invece c'è l'inizializzazione della porta seriale con i parametri standard, normalmente utilizzati (8bits, parity none, stop bits 1, nessun flow control).

Con write si va a scrivere i data direttamente nel dispositivo.

Ti è piaciuto l'articolo? Condividilo! Commentalo!

comments powered by Disqus