Come inviare i dati a una porta seriale e vedere una risposta?


37

Su Linux, voglio inviare una stringa di comando (cioè alcuni dati) a una porta seriale (contenente caratteri di controllo) e ascoltare la risposta (che di solito potrebbe contenere anche caratteri di controllo).

Come posso farlo nel modo più semplice possibile su Linux? Un esempio è apprezzato!


dovresti guardare questo unix.stackexchange.com/a/116705/53092
Kiwy,

Non ho installato intercettazione.
Alex,

1
nominare per la riapertura - non è un duplicato come suggerito.
Peter

alcune persone sono troppo stupide, suggeriscono solo domande come pubbliche. Prima di tutto disturbati a leggere le domande e le risposte.
Denis

Risposte:


54

Tutti i dispositivi su Unix sono mappati su un file di dispositivo, le porte seriali sarebbero /dev/ttyS0 /dev/ttyS1....

Per prima cosa dai un'occhiata alle autorizzazioni su quel file, supponiamo che tu stia utilizzando /dev/ttyS1.

ls -l /dev/ttyS1

Avrai bisogno dell'accesso read.write, se si tratta di un sistema condiviso, dovresti considerare le conseguenze sulla sicurezza dell'apertura per tutti.

chmod o+rw /dev/ttyS1

Un metodo molto semplice per scrivere nel file, userebbe il semplice echocomando.

echo -ne '\033[2J' > /dev/ttyS1

e leggere

cat -v < /dev/ttyS1

Puoi far funzionare il gatto in un terminale ed echo in un secondo.

Se tutto è incomprensibile, quindi baud rate, potrebbe essere necessario impostare le impostazioni dei bit prima di iniziare l'invio. sttylo farà. !! NOTA stty utilizzerà stdin come descrittore di file predefinito per influire.

Comandi equivalenti.

stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1

Questo potrebbe essere abbastanza per te per scrivere qualcosa e accedere? Non sono sicuro di ciò che stai cercando di ottenere.

Per un aspetto più interattivo, ricorda che l'approccio delle impostazioni predefinite sarebbe quello di usarlo minicomè solo un programma che fa tutto ciò che ho menzionato finora. (simile all'iperterminale in Windows, potresti avere familiarità).

Una soluzione intermedia, userebbe un programma terminale come quello screenche funzionerà su un dispositivo seriale.

screen /dev/ttyS1

man screen man minicom man stty per maggiori informazioni


Non sto ottenendo alcun risultato. Hai qualche idea?
Goldname

Eventualmente controllo del flusso hardware, spegnimento con comando atty o cinghia alta nel cavo seriale, ricerca del cavo null modem.
X Tian,

1
# stty -speed 38400 -f /dev/ttyUSB1restituiscestty: invalid argument '-speed'
Pro Backup il

1
su stty è -F (maiuscola F) per impostare il dispositivo. Anche il tuo parametro di velocità è sbagliato. È possibile utilizzare la velocità per ottenere il baud rate della porta, oppure ispeed o ospeed (senza il segno meno) per impostare le velocità di input e output, oppure solo un numero per impostare entrambe le velocità di input e output, in questo modo: stty 19200 -F / dev / ttyS ....
Paulus

Incredibile nessuno ha notato che prima, grazie @Pro Backup ho corretto l'esempio.
X Tian

11

Tutto quello che devi fare è aprire due terminali. Nel primo terminale è cattutto dal dispositivo, ad es

cat /dev/ttyS0

nell'altro terminale, è possibile inviare caratteri esadecimali arbitrari e testo al terminale, ad esempio come segue:

echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0

Il echo -ecomando abilita l'interpretazione delle escape di barra rovesciata.

Bisogna assicurarsi ovviamente che (i) le impostazioni seriali (velocità, lunghezza della parola, flusso ctrl, ecc.) Siano corrette e (ii) il dispositivo seriale (dall'altra parte) non blocchi.


Hai risposto a questi 10 minuti dopo aver scritto la mia risposta sopra e non hai aggiunto ulteriori informazioni!
X Tian,

Oh scusa, non ho letto completamente la tua risposta. Ho visto che la mia risposta è inclusa nella tua, quindi accetterò la tua risposta come quella corretta, come hai descritto proprio quello che ho descritto.
Alex,

Non so molto sulle porte COM. Potresti spiegare cosa significa "il dispositivo seriale (dall'altra parte) non sta bloccando"? Qualche problema con il firewall?
Sopalajo de Arrierez,

9

Programmi che parlano con dispositivi seriali:

picocom
minicom
socat

o da shell puoi fare:

stty -speed 19200 < /dev/ttyS0 # sets the speed of the port
exec 99<>/dev/ttyS0 (or /dev/ttyUSB0...etc)
printf "AT\r" >&99
read answer <&99  # this reads just a CR
read answer <&99  # this reads the answer OK
exec 99>&-

la tua è una risposta fantastica che mi ha insegnato i descrittori di file bidirezionali. Tuttavia, sei sicuro che l'ultima sintassi della riga per chiudere il descrittore sia corretta? Ottengo un errore di sintassi. Penso che uno exec 99<&-o exec 99>&-dovrebbe essere usato. O forse entrambi?
Yankee,

1
errore di battitura .. hai ragione
Zibri

7

Questo potrebbe essere un approccio migliore:

stty -F /dev/ttyUSB0 115200 raw -echo   #CONFIGURE SERIAL PORT
exec 3</dev/ttyUSB0                     #REDIRECT SERIAL OUTPUT TO FD 3
  cat <&3 > /tmp/ttyDump.dat &          #REDIRECT SERIAL OUTPUT TO FILE
  PID=$!                                #SAVE PID TO KILL CAT
    echo "R" > /dev/ttyUSB0             #SEND COMMAND STRING TO SERIAL PORT
    sleep 0.2s                          #WAIT FOR RESPONSE
  kill $PID                             #KILL CAT PROCESS
  wait $PID 2>/dev/null                 #SUPRESS "Terminated" output

exec 3<&-                               #FREE FD 3
cat /tmp/ttyDump.dat                    #DUMP CAPTURED DATA

Questo è molto buono perché automatizza il processo! L'unica modifica che vorrei apportare, che è totalmente opzionale, è confermare che il contenuto ricevuto è lo stesso di quello inviato - potrebbe essere solo un conteggio o pieno su diff.
HiDefLoLife,

4

Puoi leggere e scrivere su un dispositivo contemporaneamente in questo modo:

cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411

Il tuo messaggio viene inviato al secondo catda stdine il primo catinoltra la risposta stdout, trasformando il tuo terminale in una chat room.

Per finire, ctrl-ce poi eseguire fgpoi ctrl-cdi nuovo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.