如果设备在某些终端仿真器中工作,但在其他终端仿真器中不工作,则终端可能设置不正确(“不正确”的意思是“与连接另一端的设备的配置方式不同”;没有对错之分。)
通常问题是波特率、本地回声或 LF 与 CRLF 线路结束之一。stty
您可以使用(或)配置 linux 如何处理 tty 设备setserial
。
例子:
在这里,我使用atinout
通过 UART 与 Telit DE910 “AUX”端口通信。
$ 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
withatinout
来避免在调制解调器未按atinout
预期方式响应时挂起。
$ echo 'AT+CREG?' | timeout -t5 atinout - /dev/ttyUSB2 -