Risultati imprevisti che testano il loopback seriale usando echo e cat


17

Quindi ho una porta seriale RS232 standard che viene ricollegata a se stessa semplicemente eseguendo un filo da Tx a Rx. Sto testando il loopback eseguendo echoe catin due terminali separati:

cat /dev/ttyS1
echo "hi" > /dev/ttyS1

Il mio problema è con l'output. Mi aspetto di vedere un "ciao" tornare sul terminale con il gatto in esecuzione ma invece ottengo questo:

hi
[2 newlines]
hi
[4 newlines]
hi
[8 newlines]
hi
[16 newlines]
hi
[32 newlines]
hi

... e così via fino a quando ctrl+ c cat.

Dopo aver interrotto il gatto, se lo eseguo di nuovo non genererà "ciao" fino a quando eseguo l'eco una seconda volta.

È normale? Qualche idea sul perché sto vedendo questo comportamento?

Modifica : per newline, intendo ASCII 0x0A. Non ci sono ritorni a capo in questo output.


Potrebbe essere causato dall'avere due processi che aprono lo stesso dispositivo? Cosa succede se si esegue tip /dev/ttyS1( ~.per uscire) e si tenta di digitare i dati lì? Dovrebbe essere visualizzato nel terminale quando il filo è collegato, poiché riceve ciò che ha trasmesso.
MR

3
Stai davvero ottenendo newline o una coppia di ritorno a capo / newline? La distinzione è importante a livello di lavoro. Prova "cat / dev / ttyS1> somefile", quindi fai "od -x somefile" per vedere esattamente quali byte provengono dal file del dispositivo TTY. Inoltre, esegui "stty -F / dev / ttyS1 -a". Leggi la pagina man per "stty" e guarda cosa ti dice l'output di stty, per ogni piccola impostazione. Le comunicazioni seriali RS232 sono difficili.
Bruce Ediger,

Risposte:


21

Grazie al secondo commento di Bruce, sono stato in grado di capire il problema da solo.

Dopo l'esecuzione stty -a -F /dev/ttyS1, c'erano 3 opzioni che ho trovato per contribuire al problema: "echo", "onlcr" e "icrnl".

Poiché questa porta seriale viene ripristinata su se stessa, ecco cosa è successo dopo l'esecuzione echo "hi" > /dev/ttyS1:

  1. Il echocomando aggiunge una nuova riga alla fine del messaggio per impostazione predefinita, quindi "hi" + LF viene inviato a / dev / ttyS1
  2. Poiché è stato impostato "onlcr", il dispositivo seriale ha convertito l'LF in CRLF, quindi il messaggio fisico inviato alla linea Tx era "hi" + CRLF
  3. Poiché è stato impostato "icrnl", il messaggio fisico ricevuto sulla linea Rx ha convertito il CR in LF. Quindi il messaggio emesso da 'cat' era "ciao" + LFLF.
  4. Poiché è stato impostato "echo", il messaggio ricevuto su Rx ("hi" + LFLF), è stato quindi rispedito sulla linea Tx.
  5. A causa di onlcr, "hi" + LFLF è diventato "hi" + CRLFCRLF.
  6. A causa di icrnl, "ciao" + CRLFCRLF è diventato "ciao" + LFLFLFLF
  7. A causa dell'eco, "ciao" + LFLFLFLF è stato quindi inviato il Tx

E così via...

Per risolvere questo problema, ho eseguito il seguente comando:

stty -F /dev/ttyS1 -echo -onlcr

La disabilitazione di "echo" impedisce un ciclo infinito di messaggi e la disabilitazione di "onlcr" impedisce al dispositivo seriale di convertire LF in CRLF in uscita. Ora catriceve un "ciao" (con una sola nuova riga!) Per ogni volta che corro echo.

CR = ritorno a capo (ASCII 0x0D); LF = avanzamento riga o newline (ASCII 0x0A)


-icrnlha fatto il trucco per me.
tcpaiva,

3

Ho avuto un problema simile anche nel concatenare i file in un seriale tty per il test. Oltre alla risposta accettata:

Se stai testando l'output seriale facendo qualcosa del tipo cat somefile.txt > /dev/ttyS0:, avrà una buona quantità di dati byte imprevisti se stai testando valori esatti di byte.

Con sttyfacendo un semplice stty raw -F /dev/ttyS0fermerà il terminale da inserimento / sostituzione di caratteri (ad esempio [...] 0x0A [...]-> [...] 0x0D 0x0A [...]). Il rawflag cambia le modalità del terminale, quindi non viene eseguita alcuna elaborazione di input e output.


1
Hmm ... non sembra stty rawdisabiliterà l'eco per impostazione predefinita. Potrebbe essere necessario farlo stty raw -echo.
BMiner,
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.