从Linux命令行向串口写入数据

45

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

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

设备启动所请求的操作。

当我试图从独立的Debian框或来自同一台Windows机器的Debian VirtualBox实例完成相同的操作时,迄今为止我还没有成功。

以下是等效的Linux命令(至少我认为如此):

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

什么也没有发生。

我该怎么做?

3个回答

36
如果你想使用十六进制代码,你应该添加-e选项来启用echo对反斜杠转义的解释(但与echo Ctrl+ RCtrl + B的结果相同)。而且根据wallyk所说,你可能想要添加-n来防止输出换行符:
echo -en '\x12\x02' > /dev/ttyS0

还要确保/dev/ttyS0是你想要的端口。


谢谢,我确定我需要的是端口,有没有更简单的测试串行连接的方法?回显总是返回成功。 - erin c
1
如果您正在使用bash,请使用$''引用:printf $'\x12\x02' >/dev/ttyS0 - Toby Speight
我该如何知道我的串口打印机连接到了哪个端口? - Hrvoje T

17
echo '\x12\x02'

不会被解释,而是会直接将字符串\x12\x02(并追加一个换行符)写入指定的串口。建议使用:

echo -n ^R^B
您可以在命令行中通过输入 CtrlVCtrlRCtrlVCtrlB 来构建该字符串。或者更简单的方式是使用编辑器将其输入到脚本文件中。 stty 命令应该有效,除非有其他程序正在干扰。一个常见的罪魁祸首是 gpsd,它会寻找插入的 GPS 设备。

非常感谢您的回复,我尝试了命令行中的echo -n CTRL+VCTRL+RCTRRL+VCTRL+B,但无法使其工作。我想尝试其他命令,因此想知道您是如何得出这些翻译的(0x12 = ^R,0x02 = ^B),我想它们不是ASCII翻译。 - erin c
1
使用 man ascii 命令查看 0x12 与 Ctrl-R 的关系。它们都是纯 ASCII 码。有些 Ctrl 组合键可能无法正常工作,例如 ctrl-@(NUL)。编写一个二进制协议的程序可能更容易实现。 - wallyk
谢谢,我完全明白了,但不幸的是它不起作用,我怀疑有些东西正在干扰stty,我没有运行gpsd。我需要更深入地研究这个问题。 - erin c
1
终于成功了,我在虚拟机的串口配置上遇到了问题,感谢您的帮助。 - erin c

7

使用Screen

注意:据我所知,Screen实际上无法发送十六进制。要做到这一点,请使用echoprintf

我正在使用此帖子中的建议向串行端口写入数据,然后使用另一篇帖子中的信息从端口读取数据,但效果不佳。我发现使用Screen是一个“更容易”的解决方案,因为它直接打开与该端口的终端会话。(我用引号括起来是因为,我认为Screen的界面非常奇怪,需要进一步阅读才能弄清楚。)

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

screen /dev/ttyS0 19200,cs8

(将上述内容更改以适应您对速度、奇偶校验、停止位等的需求。)我意识到Screen不是“Linux命令行”,因为该帖子特别要求,但我认为它的精神相同。此外,您无需每次键入echo和引号。

echo

它遵循 praetorian droid's answer然而,在我发送echo命令时,这对我没有起作用,直到我还使用了cat命令(cat < /dev/ttyS0)。 同时使用。

printf

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

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

对于printf,发送命令之前,请先启动cat < /dev/ttyS0


1
直到我按照MrUser所说的那样做,才让事情有了进展:在你写入之前,你必须监听/dev/ttyS0。 - Gouda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接