Как отправить данные на последовательный порт и увидеть какой-либо ответ?


37

В Linux я хочу отправить командную строку (т.е. некоторые данные) на последовательный порт (содержащий управляющие символы) и прослушать ответ (который также обычно может содержать управляющие символы).

Как я могу сделать это как можно проще в Linux? Пример ценится!


Вы должны посмотреть на этот unix.stackexchange.com/a/116705/53092
Kiwy

У меня не установлено перехват.
Алекс

1
номинирование на повторное открытие - это не дубликат, как предложено.
Петер

некоторые люди слишком глупы, они просто предлагают вопросы как повторяющиеся. Сначала потрудитесь прочитать вопросы и ответьте.
Денис

Ответы:


54

Все устройства в Unix сопоставлены с файлом устройства, последовательные порты будут /dev/ttyS0 /dev/ttyS1....

Сначала посмотрим на разрешения для этого файла, давайте предположим, что вы используете /dev/ttyS1.

ls -l /dev/ttyS1

Вам понадобится доступ для чтения и записи. Если это общая система, вам следует рассмотреть последствия безопасности, открывающие ее для всех.

chmod o+rw /dev/ttyS1

Очень простой грубый метод записи в файл - использовать простую echoкоманду.

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

и читать

cat -v < /dev/ttyS1

Вы можете запустить кошку в одном терминале, а эхо - во втором.

Если все происходит бессмысленно, то перед началом отправки может потребоваться настройка скорости передачи, битовых настроек. sttyсделаю это. !! ПРИМЕЧАНИЕ stty будет использовать stdin в качестве дескриптора файла по умолчанию для воздействия.

Эквивалентные команды.

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

Это может быть достаточно для того, чтобы написать что-нибудь и войти? Не уверен, что вы пытаетесь достичь.

Для более интерактивного, помните, ваш подход к настройкам по умолчанию будет использовать minicomэто просто программа, которая делает все, что я упомянул до сих пор. (похоже на гипертерминал в Windows, вы можете быть знакомы).

Промежуточное решение, будет использовать терминальную программу, например, screenкоторая будет работать на последовательном устройстве.

screen /dev/ttyS1

man screen man minicom man stty за дополнительной информацией


Я не получаю никакого вывода вообще. Есть идеи?
Goldname

Возможно аппаратное управление потоком, либо выключите с помощью команды atty, либо подключите кабель к последовательному кабелю, найдите нуль-модемный кабель.
X Тянь

1
# stty -speed 38400 -f /dev/ttyUSB1возвращаетсяstty: invalid argument '-speed'
Pro Backup

1
для настройки это -F (заглавная F). Также ваш параметр скорости неверен. Вы можете использовать скорость, чтобы получить скорость передачи данных порта, или скорость или скорость (без знака минус), чтобы установить скорости ввода и вывода, или просто число, чтобы установить скорости ввода и вывода, например: stty 19200 -F / dev / ttyS ....
Паулюс

Удивительно, что никто не заметил, что раньше, спасибо @Pro Backup, я исправил пример.
X Тянь

11

Все, что вам нужно сделать, это открыть два терминала. В первом терминале у вас catвсе с устройства, например

cat /dev/ttyS0

в другом терминале вы можете отправлять произвольные шестнадцатеричные символы и текст в терминал, например, следующим образом:

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

Команда echo -eвключает интерпретацию обратной косой черты.

Разумеется, необходимо убедиться, что (i) последовательные настройки (скорость, длина слова, ctrl потока и т. Д.) Верны и (ii) последовательное устройство (на другом конце) не блокируется.


Вы ответили на это через 10 минут после того, как я написал свой ответ выше, и вы вообще не добавили никакой дополнительной информации!
X Tian

Извините, я не прочитал ваш ответ полностью. Я видел, что мой ответ включен в ваш, поэтому я приму ваш ответ как правильный, поскольку вы описали только то, что я описал.
Алекс

Я не знаю много о COM-портах. Не могли бы вы объяснить, что означает "не блокирующее последовательное устройство (на другом конце)"? Некоторые проблемы с брандмауэром?
Сопалахо де Арриерес

9

Программы, которые общаются с последовательными устройствами:

picocom
minicom
socat

или из оболочки вы можете сделать:

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

Ваш удивительный ответ, который научил меня двунаправленным файловым дескрипторам. Однако вы уверены, что синтаксис последней строки для закрытия дескриптора верен? Я получаю синтаксическую ошибку. Я думаю, что либо exec 99<&-или exec 99>&-должны быть использованы. Или возможно оба?
Янки

1
опечатка .. ты прав
Зибри

7

Это может быть лучшим подходом:

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

Это очень хорошо, потому что это автоматизирует процесс! Единственное изменение, которое я бы сделал, что является абсолютно необязательным, это подтверждение того, что полученное содержимое совпадает с отправленным - это может быть просто подсчет или заполнение в diff.
HiDefLoLife

4

Вы можете читать и записывать на устройство одновременно:

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

Ваше сообщение будет отправлено на второй catиз stdin, а первые catреле ответ на stdout, превращая ваш терминал в чат.

Чтобы закончить ctrl-c, fgзатем ctrl-cснова запустите .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.