从linux命令行写入串口

时间:2012-01-16 08:22:49

标签: linux serial-port virtualbox

从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 个答案:

答案 0 :(得分:33)

如果要使用十六进制代码,则应添加-e选项以启用echo对反斜杠转义的解释(但结果与echo Ctrl 相同 - [R 控制 )。正如wallyk所说,你可能想添加-n来阻止换行的输出:

echo -en '\x12\x02' > /dev/ttyS0

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

答案 1 :(得分:17)

echo '\x12\x02'

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

echo -n ^R^B

你可以在命令行上输入 Ctrl V Ctrl R Ctrl V 控制 。或者使用编辑器输入脚本文件更容易。

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

答案 2 :(得分:6)

<强>屏幕:

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

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

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

screen /dev/ttyS0 19200,cs8

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

<强> ECHO:

关注praetorian droid的回答。但是,在我发送echo命令的 之前,我也使用cat命令(cat < /dev/ttyS0,这对我不起作用。

<强> PRINTF:

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

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

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