【问题标题】:writing to serial port from linux command line从linux命令行写入串口
【发布时间】:2012-01-16 08:22:48
【问题描述】:

在 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

什么都没有发生。

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

【问题讨论】:

    标签: linux serial-port virtualbox


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我确定是我想要的端口,有没有更简单的测试串口的方法,echo总是返回成功。
    • 如果您使用bash,请使用$'' 引用:printf $'\x12\x02' >/dev/ttyS0
    • 我如何知道我的串口打印机连接到哪个端口?
    【解决方案2】:
    echo '\x12\x02'
    

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

    echo -n ^R^B
    

    你可以在命令行上输入 CtrlVCtrlRCtrl VCtrlB。或者使用编辑器输入脚本文件更容易。

    stty 命令应该可以工作,除非有其他程序干扰。一个常见的罪魁祸首是gpsd,它会查找正在插入的 GPS 设备。

    【讨论】:

    • 非常感谢您的回复,我从命令行尝试了 echo -n CTRL+VCTRL+RCTRRL+VCTRL+B 但我无法使其工作,我想尝试其他命令,因此我想知道你是怎么想出这些翻译的(0x12 = ^R,0x02 = ^B),我想这些不是 ascii 翻译。
    • @erincarikan:使用man ascii 查看 0x12 与 Ctrl-R 的关系。它们是纯ASCII。某些 ctrl 组合可能不起作用,例如 ctrl-@ (NUL)。编写一个程序来执行这样的二进制协议可能会更容易。
    • 谢谢我完全明白了,但不幸的是它不起作用,我怀疑有什么东西干扰了 stty ,我没有运行 gpsd。我必须对此进行更多研究。
    • 终于成功了,我的virtualbox串口配置有问题,谢谢帮助。
    【解决方案3】:

    屏幕:

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

    我使用这篇文章中的建议写入串行端口,然后使用来自另一个 post 的信息从端口读取,结果好坏参半。我发现使用 screen 是一种“更简单”的解决方案,因为它直接使用该端口打开终端会话。 (我用引号更容易了,因为 screen 有一个非常奇怪的界面,IMO,并且需要进一步阅读才能弄清楚。)

    你可以发出这个命令来打开一个屏幕会话,然后你输入的任何东西都会被发送到端口,并且返回值会打印在它下面:

    screen /dev/ttyS0 19200,cs8
    

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

    回声:

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

    打印文件:

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

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

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

    【讨论】:

    • 在我按照 MrUser 所说的那样做之前,没有什么对我有用:您必须先监听 /dev/ttyS0,然后才能对其进行写入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2020-07-06
    相关资源
    最近更新 更多