Jak wysłać dane do portu szeregowego i zobaczyć odpowiedź?


37

W systemie Linux chcę wysłać ciąg komend (tj. Niektóre dane) do portu szeregowego (zawierającego znaki sterujące) i wysłuchać odpowiedzi (która zwykle może również zawierać znaki sterujące).

Jak mogę to zrobić tak prosto, jak to możliwe w systemie Linux? Przykład jest doceniany!


powinieneś spojrzeć na ten unix.stackexchange.com/a/116705/53092
Kiwy

Nie mam zainstalowanego przechwytywania.
Alex

nominowanie do ponownego otwarcia - nie jest to duplikat, jak sugerowano.
peterph

niektórzy ludzie są zbyt głupi, sugerują tylko dublowanie pytań. Najpierw zawracaj sobie głowę czytaniem pytań i odpowiedzi.
Denis,

Odpowiedzi:


54

Wszystkie urządzenia w systemie Unix są mapowane na plik urządzenia, porty szeregowe to /dev/ttyS0 /dev/ttyS1...

Najpierw spójrz na uprawnienia do tego pliku, załóżmy, że używasz /dev/ttyS1.

ls -l /dev/ttyS1

Będziesz potrzebował dostępu do odczytu i zapisu, jeśli jest to system współdzielony, powinieneś rozważyć konsekwencje bezpieczeństwa otwarcia go dla wszystkich.

chmod o+rw /dev/ttyS1

Bardzo prosta, prymitywna metoda zapisu do pliku, używa prostej echokomendy.

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

i czytać

cat -v < /dev/ttyS1

Możesz mieć kota biegającego w jednym terminalu, a echo w drugim.

Jeśli wszystko jest bełkotliwe, a następnie szybkość transmisji, ustawienia bitów mogą wymagać ustawienia przed rozpoczęciem wysyłania. sttyzrobi to. !! UWAGA stty użyje stdin jako domyślnego deskryptora pliku.

Równoważne polecenia.

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

To może wystarczyć, aby coś napisać i zalogować? Nie jestem pewien, co próbujesz osiągnąć.

Dla bardziej interaktywnego, pamięta, że ​​twoim domyślnym podejściem do ustawień byłoby użycie minicomgo, to po prostu program, który robi wszystko, o czym wspomniałem do tej pory. (podobny do hiperterminalnego w systemie Windows, być może znasz).

Pośrednim rozwiązaniem byłoby użycie programu terminalowego, screenktóry działałby na urządzeniu szeregowym.

screen /dev/ttyS1

man screen man minicom man stty po więcej informacji


W ogóle nie otrzymuję żadnych wyników. Masz jakieś pomysły?
Goldname

Prawdopodobnie sprzętowa kontrola przepływu, albo wyłącz komendę atty, albo pasek wysoko w kablu szeregowym, poszukaj kabla zerowego modemu.
X Tian

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

1
na stty jest -F (duże F), aby ustawić urządzenie. Również parametr prędkości jest nieprawidłowy. Możesz użyć prędkości, aby uzyskać prędkość transmisji portu, lub prędkości lub prędkości (bez znaku minus), aby ustawić prędkości wejściowe i wyjściowe, lub po prostu liczby, aby ustawić prędkość wejściową i wyjściową, na przykład: stty 19200 -F / dev / ttyS ....
Paulus

Niesamowite, że nikt wcześniej tego nie zauważył, dziękuję @Pro Backup Poprawiłem przykład.
X Tian

11

Wszystko, co musisz zrobić, to otworzyć dwa terminale. W pierwszym terminalu masz catwszystko z urządzenia, np

cat /dev/ttyS0

w drugim terminalu możesz wysyłać dowolne znaki szesnastkowe i tekst do terminala, np. w następujący sposób:

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

echo -eKomenda umożliwia interpretację ucieczek backslash.

Należy oczywiście upewnić się, że (i) ustawienia szeregowe (prędkość, długość słowa, przepływ ctrl itp.) Są prawidłowe i (ii) urządzenie szeregowe (na drugim końcu) nie blokuje się.


Odpowiedziałeś na te 10 minut po tym, jak napisałem moją odpowiedź powyżej i nie dodałeś żadnych dalszych informacji!
X Tian

Och przepraszam, nie przeczytałem całkowicie twojej odpowiedzi. Widziałem, że moja odpowiedź jest zawarta w twojej, więc zaakceptuję odpowiedź jako prawidłową, ponieważ opisałeś dokładnie to, co opisałem.
Alex

Nie wiem dużo o portach COM. Czy możesz wyjaśnić, co oznacza „urządzenie szeregowe (na drugim końcu) nie blokuje”? Masz problem z zaporą?
Sopalajo de Arrierez

9

Programy komunikujące się z urządzeniami szeregowymi:

picocom
minicom
socat

lub z powłoki możesz zrobić:

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>&-

twoja jest niesamowitą odpowiedzią, która nauczyła mnie o dwukierunkowych deskryptorach plików. Czy jesteś jednak pewien, że ostatnia linia do zamknięcia deskryptora jest poprawna? Dostaję błąd składniowy. Myślę, że albo exec 99<&-czy exec 99>&-powinien być stosowany. A może jedno i drugie?
Yankee

1
literówka .. masz rację
Zibri

7

Może to być lepsze podejście:

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

Jest to bardzo dobre, ponieważ automatyzuje proces! Jedyną zmianą, którą wprowadziłbym, która jest całkowicie opcjonalna, jest potwierdzenie, że otrzymana zawartość jest taka sama jak wysłana - może to być tylko liczba lub pełna na diff.
HiDefLoLife

4

Możesz czytać i pisać na urządzeniu jednocześnie:

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

Twoja wiadomość jest wysyłana do drugiego catz stdin, a pierwszy catprzekazuje odpowiedź stdout, zamieniając terminal w pokój rozmów.

Aby dokończyć, ctrl-c, a następnie uruchomić fgnastępnie ctrl-cponownie.

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.