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!

Alex
źródło
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

X Tian
źródło
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ę.

Alex
źródło
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>&-
Zibri
źródło
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
Leonardo Mendoza
źródło
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.

diachedelic
źródło