从linux命令行写入串口

eri*_*n c 43 linux virtualbox serial-port

从Windows我可以使用以下命令与串口设备通信:

mode com1: baud=9600 data=8 parity=n stop=1
copy con com1
alt+18alt+2ctrl+z
Run Code Online (Sandbox Code Playgroud)

设备启动请求的操作.

当我尝试从一个独立的debian盒子或同一个windows机器的debian virtualbox实例完成相同的操作时,到目前为止我没有运气.

这是等效的linux命令(至少我是这么认为的)

stty -F /dev/ttyS0 speed 9600 cs8 -cstopb -parenb
echo '\x12\x02' > /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)

什么都没发生.

有人可以指引我走向正确的方向吗?

pra*_*oid 33

如果要使用十六进制代码,则应添加-e选项以通过echo启用反斜杠转义的解释(但结果与其相同echoCtrlRCtrlB).正如wallyk所说,你可能想要添加-n以防止换行的输出:

echo -en '\x12\x02' > /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)

还要确保这/dev/ttyS0是您想要的端口.


wal*_*lyk 17

echo '\x12\x02'
Run Code Online (Sandbox Code Playgroud)

将不会被解释,并将字符串写入\x12\x02(并附加换行符)到指定的串行端口.而是使用

echo -n ^R^B
Run Code Online (Sandbox Code Playgroud)

您可以通过键入CtrlVCtrlR和在命令行上构建CtrlVCtrlB.或者使用编辑器输入脚本文件更容易.

stty命令应该有效,除非另一个程序在干扰.常见的罪魁祸首是gpsd寻找插入的GPS设备.


MrU*_*ser 7

屏幕:

注意:据我所知,屏幕实际上无法发送十六进制.为此,请使用echoprintf

我正在使用这篇文章中的建议写入串口,然后使用另一篇帖子中的信息从端口读取,结果不一致.我发现使用屏幕是一种"更简单"的解决方案,因为它直接打开了与该端口的终端会话.(我把引号更容易,因为屏幕有一个非常奇怪的界面,IMO,并需要进一步阅读来解决它.)

您可以发出此命令以打开屏幕会话,然后您输入的任何内容都将被发送到端口,并且返回值将打印在其下方:

screen /dev/ttyS0 19200,cs8
Run Code Online (Sandbox Code Playgroud)

(更改以上内容以适应您对速度,奇偶校验,停止位等的需求.)我认识到屏幕不是"linux命令行",因为帖子特别要求,但我认为它是以同样的精神.另外,您不必每次都输入echo和引号.

回声:

按照praetorian droid的回答.但是,我发送echo命令的同时,我也使用了cat命令(cat < /dev/ttyS0),这对我不起作用.

PRINTF:

我发现也可以使用printf的'%x'命令:

c="\x"$(printf '%x' 0x12)
printf $c >> $SERIAL_COMM_PORT
Run Code Online (Sandbox Code Playgroud)

同样,对于printf,cat < /dev/ttyS0在发送命令之前启动.