Запись в последовательный порт из командной строки linux
Из окон я могу общаться с устройством последовательного порта, используя следующие команды:
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
Ничего не происходит.
Может ли кто-нибудь направить меня в правильном направлении?
Ответы
Ответ 1
echo '\x12\x02'
не будет интерпретироваться и буквально будет писать строку \x12\x02
(и добавить новую строку) к указанному последовательному порту. Вместо этого используйте
echo -n ^R^B
которую вы можете построить в командной строке, набрав Ctrl V Ctrl R и Ctrl V Ctrl B. Или проще использовать редактор для ввода в файл script.
Команда stty
должна работать, если другая программа не вмешивается. Общим виновником является gpsd
, который ищет подключенные устройства GPS.
Ответ 2
Если вы хотите использовать шестнадцатеричные коды, вы должны добавить опцию -e
, чтобы включить интерпретацию обратных следов с помощью эха (но результат будет таким же, как с echo
Ctrl R Ctrl B). И, как сказал wallyk, вы, вероятно, захотите добавить -n
, чтобы предотвратить вывод новой строки:
echo -en '\x12\x02' > /dev/ttyS0
Также убедитесь, что /dev/ttyS0
- это нужный вам порт.
Ответ 3
SCREEN:
ПРИМЕЧАНИЕ: на самом деле экран не может отправлять шестнадцатеричные данные, насколько я знаю. Для этого используйте echo
или printf
Я использовал предложения в этом сообщении, чтобы писать в последовательный порт, а затем использовать информацию из другого сообщения для чтения из порта со смешанными результатами. Я обнаружил, что использование экрана - это "более легкое" решение, так как оно открывает сеанс терминала непосредственно с этим портом. (Я ставлю проще в кавычках, потому что экран имеет действительно странный интерфейс, IMO, и для его выяснения еще немного читаем.)
Вы можете отправить эту команду, чтобы открыть сеанс экрана, затем все, что вы набираете, будет отправлено на порт, а ниже будут напечатаны возвращаемые значения:
screen /dev/ttyS0 19200,cs8
(Измените приведенное выше, чтобы оно соответствовало вашим потребностям в скорости, четности, стоповых битах и т.д.). Я понимаю, что экран не является "командной линией Linux", поскольку сообщение специально запрашивает, но я думаю, что это в том же духе. Кроме того, вам не нужно каждый раз вводить эхо и кавычки.
ECHO:
Следуйте за преторианским дроидом. ОДНАКО, это не сработало для меня, пока я также не использовал команду cat (cat < /dev/ttyS0
), пока я отправлял команду эха.
PRINTF:
Я обнаружил, что можно использовать команду printf '% x':
c="\x"$(printf '%x' 0x12)
printf $c >> $SERIAL_COMM_PORT
Опять же, для printf запустите cat < /dev/ttyS0
перед отправкой команды.