Nieoczekiwane wyniki testowania szeregowego sprzężenia zwrotnego za pomocą echa i cat


18

Mam więc standardowy port szeregowy RS232, który jest zapętlony z powrotem przez samo poprowadzenie przewodu od Tx do Rx. Testuję pętlę zwrotną, uruchamiając echoi catna dwóch osobnych terminalach:

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

Mój problem dotyczy wyniku. Spodziewałbym się, że jedno „cześć” powróci na terminalu z kotem, ale zamiast tego otrzymuję:

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

... i tak dalej, aż ja ctrl+ c cat.

Po przerwaniu kota, jeśli uruchomię go ponownie, nie wyemituje „cześć”, dopóki nie uruchomię echa po raz drugi.

Czy to normalne? Wiesz, dlaczego widzę takie zachowanie?

Edycja : Przez nową linię mam na myśli ASCII 0x0A. W tym wyjściu nie ma powrotu karetki.


Czy może to być spowodowane tym, że dwa procesy otwierają to samo urządzenie? Co jeśli uruchomisz tip /dev/ttyS1( ~.aby wyjść) i spróbujesz wpisać tam dane? Powinien być wyświetlany w twoim terminalu, gdy przewód jest podłączony, ponieważ odbiera to, co przesłał.
mrb

3
Czy naprawdę otrzymujesz nowe linie lub parę karetki-powrotu / nowej linii? To rozróżnienie jest ważne na poziomie, na którym pracujesz. Spróbuj „cat / dev / ttyS1> somefile”, a następnie wykonaj „od -x somefile”, aby zobaczyć, jakie bajty wychodzą z pliku urządzenia TTY. Wykonaj także „stty -F / dev / ttyS1 -a”. Przeczytaj stronę podręcznika dla „stty” i spójrz na to, co mówi ci wynik stty, dla każdego małego ustawienia. Komunikacja szeregowa RS232 jest trudna.
Bruce Ediger,

Odpowiedzi:


21

Dzięki drugiemu komentarzowi Bruce'a mogłem samodzielnie rozwiązać problem.

Po uruchomieniu stty -a -F /dev/ttyS1znalazłem 3 opcje, które przyczyniły się do rozwiązania problemu: „echo”, „onlcr” i „icrnl”.

Ponieważ ten port szeregowy jest zapętlony z powrotem do siebie, oto, co się stało po uruchomieniu echo "hi" > /dev/ttyS1:

  1. The echoPolecenie dołącza do nowej linii na końcu wiadomości domyślnie tak „hi” + LF jest wysyłany do / dev / ttyS1
  2. Ponieważ ustawiono „onlcr”, urządzenie szeregowe przekonwertowało LF na CRLF, więc fizyczny komunikat wysłany z linii Tx brzmiał „hi” + CRLF
  3. Ponieważ ustawiono „icrnl”, fizyczny komunikat otrzymany w linii Rx przekonwertował CR na LF. Tak więc wiadomość wysłana przez „cat” to „hi” + LFLF.
  4. Ponieważ ustawiono „echo”, wiadomość odebrana na Rx („cześć” + LFLF), została następnie wysłana z powrotem na linię Tx.
  5. Z powodu onlcr „hi” + LFLF zmieniło się na „hi” + CRLFCRLF.
  6. Z powodu icrnl „hi” + CRLFCRLF zmieniło się na „hi” + LFLFLFLF
  7. Z powodu echa „cześć” + LFLFLFLF zostało następnie wysłane Tx

I tak dalej...

Aby rozwiązać ten problem, uruchomiłem następujące polecenie:

stty -F /dev/ttyS1 -echo -onlcr

Wyłączenie „echa” zapobiega nieskończonej pętli komunikatów, a wyłączenie „onlcr” zapobiega konwersji urządzenia LF na CRLF na wyjściu. Teraz catotrzymuje jedno „cześć” (z jednym nowym wierszem!) Za każdym razem, gdy uruchamiam echo.

CR = powrót karetki (ASCII 0x0D); LF = znak wiersza lub nowy wiersz (ASCII 0x0A)


-icrnlzrobił dla mnie lewę.
tcpaiva

3

Miałem również podobny problem z łączeniem plików w szeregowy tty do testowania. Oprócz zaakceptowanej odpowiedzi:

Jeśli testujesz wyjście szeregowe, wykonując coś takiego: cat somefile.txt > /dev/ttyS0 :, będzie mieć sporo nieoczekiwanych danych bajtowych, jeśli testujesz dokładne wartości bajtów.

Z sttywykonując proste stty raw -F /dev/ttyS0zatrzyma terminal włożeniu / wymianie znaków (na przykład [...] 0x0A [...]-> [...] 0x0D 0x0A [...]). rawFlaga zmienia tryby terminal więc nie przetwarzanie wejście i wyjście jest wykonywana.


1
Hmm ... nie wygląda na to, stty rawże domyślnie wyłączy echo. Być może będziesz musiał to zrobić stty raw -echo.
BMiner,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.