запись в последовательный порт из командной строки Linux - PullRequest
42 голосов
/ 16 января 2012

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

mode com1: baud=9600 data=8 parity=n stop=1
copy con com1
alt+18alt+2ctrl+z

Устройство запускает запрошенную операцию.

Когда я пытаюсь выполнить ту же операцию из автономного окна Debian или из экземпляра виртуального ящика Debian на той же машине с Windows, мне пока не везет.

Вот эквивалентные команды Linux (по крайней мере, я так думаю)

stty -F /dev/ttyS0 speed 9600 cs8 -cstopb -parenb
echo '\x12\x02' > /dev/ttyS0

Ничего не происходит.

Может кто-нибудь, пожалуйста, направьте меня в правильном направлении?

Ответы [ 3 ]

33 голосов
/ 16 января 2012

Если вы хотите использовать шестнадцатеричные коды, вы должны добавить опцию -e, чтобы включить интерпретацию экранирования обратной косой черты по эхо (но результат такой же, как с echo Ctrl R Ctrl B ).И, как сказал Уоллик, вы, вероятно, захотите добавить -n для предотвращения вывода новой строки:

echo -en '\x12\x02' > /dev/ttyS0

Также убедитесь, что /dev/ttyS0 - это нужный вам порт.

17 голосов
/ 16 января 2012
echo '\x12\x02'

не будет интерпретироваться и будет буквально записывать строку \x12\x02 (и добавлять новую строку) в указанный последовательный порт. Вместо этого используйте

echo -n ^R^B

, который вы можете построить в командной строке, набрав Ctrl V Ctrl R и Ctrl V * 1 017 * Ctrl B * * тысяча двадцать одна. Или проще использовать редактор для ввода в файл сценария.

Команда stty должна работать, если не вмешивается другая программа. Распространенным виновником является gpsd, который ищет подключенные GPS-устройства.

6 голосов
/ 07 августа 2014

ЭКРАН:

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

. Я использовал предложения из этого поста для записи в последовательный порт, а затем использовал информацию из другого поста для чтения изпорт, со смешанными результатами.Я обнаружил, что использование экрана является «более простым» решением, поскольку оно открывает сеанс терминала непосредственно с этим портом.(Я пишу проще в кавычках, потому что screen имеет действительно странный интерфейс, IMO, и требует дополнительного чтения, чтобы понять это.)

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

screen /dev/ttyS0 19200,cs8

(Измените приведенное выше, чтобы соответствовать вашим потребностям в скорости, четности, стоп-битах и ​​т. д.) Я понимаю, что экран не«Линукс командная строка», как конкретно просит пост, но я думаю, что это в том же духе.Кроме того, вам не нужно каждый раз вводить эхо и кавычки.

ECHO:

Следуйте ответу преторианского дроида.ОДНАКО, это не работало для меня, пока я также не использовал команду cat (cat < /dev/ttyS0) , пока я отправлял команду echo.

PRINTF:

Я обнаружил, что можно также использовать команду printf '% x':

c="\x"$(printf '%x' 0x12)
printf $c >> $SERIAL_COMM_PORT

Снова, для printf, перед отправкой команды запустите cat < /dev/ttyS0.

...