Если устройство работает в некоторых эмуляторах терминала, но не работает в других, то терминал, вероятно, настроен неправильно («Неправильно» означает «отличается от того, как настроено устройство на другой стороне соединения»; нет правильного или неправильного).
Обычно проблема связана со скоростью передачи данных, локальным эхом или окончаниями строк LF и CRLF. Вы можете настроить, как Linux обрабатывает tty-устройство с помощью stty
(или setserial
).
Пример:
Здесь я использую atinout
для связи с портом Telit DE910 «AUX» через UART.
$ echo 'AT+CREG?' | atinout - /dev/ttyO1 -
AT+CREG?
+CREG: 1,1
OK
Все идет нормально. Но этот модем поддерживает несколько физических интерфейсов для каждого логического интерфейса, и с моим устройством логический порт "AUX" также доступен через /dev/ttyUSB2
. В общем, мне нравится использовать /dev/ttyUSBn
, потому что по крайней мере некоторые из смехотворного количества параметров, которые можно установить с помощью stty
исправлены. Но в этом случае значения по умолчанию недостаточно хороши для atinout
, даже несмотря на то, что мы отправляем одну и ту же команду на один и тот же логический порт:
$ echo 'AT+CREG?' | atinout - /dev/ttyUSB2 -
AT+CREG?
+CREG: 1,1
OK
AT+CREG
ERROR
^C
В этом случае дополнительные CRLF — это раздача, и настройка терминала с помощью stty raw
исправляет это. (В моем случае -icrnl
была единственной действительно необходимой частью raw
.)
$ stty -F /dev/ttyUSB2 raw
$ echo 'AT+CREG?' | atinout - /dev/ttyUSB2 -
AT+CREG?
+CREG: 1,1
OK
Проблема с использованием stty
заключается в том, что вы изменили устройство для всех остальных. Вы можете использовать stty для сохранения исходной конфигурации, чтобы вы могли восстановить ее, когда закончите.
$ OLDSETTINGS=$(stty -g -F /dev/ttyUSB2)
$ stty -F /dev/ttyUSB2 -igncr -icrnl -ixon -ixoff
$ stty -F /dev/ttyUSB2 "$OLDSETTINGS"
Наконец, я рекомендую использовать timeout
с atinout
, чтобы избежать зависания, когда модем не отвечает так, как ожидает atinout
.
$ echo 'AT+CREG?' | timeout -t5 atinout - /dev/ttyUSB2 -
person
Robert Calhoun
schedule
24.05.2016
EOF
действительно не является командой. Почему вы думаете, что можете запустить его как один? - person Charles Duffy   schedule 10.02.2016