![Echo/Pipe 命令输出至串行线](https://linux22.com/image/1432023/Echo%2FPipe%20%E5%91%BD%E4%BB%A4%E8%BE%93%E5%87%BA%E8%87%B3%E4%B8%B2%E8%A1%8C%E7%BA%BF.png)
我有一个在 /dev/ttyUSB0 上运行 115200 波特的串行设备。我需要将命令的输出通过管道传输给它。我需要类似的东西:
command-that-gives-stdout | command-that-puts-stdin-to-serial --baud 115200 /dev/ttyUSB0
在此先谢谢您的帮助!
附加信息:
我有一个运行在 arduino 上的 grbl Sheild。它控制 CNC 机器。我可以通过串行连接(/dev/ttyUSB0 以 115200 波特率运行)将 GCode 发送到 arduino。我通常通过 arduino ide 的串行监视器发送 gcode。我有几个用于生成 gcode 的 python 文件,它们输出到 stdout。我可以直接复制并粘贴 gcode,但很多使用它的人可能会对此感到困惑。
答案1
我认为以下命令应该有效:
( stty raw speed 115200 >&2; echo -ne 'output-string' ) >/dev/ttyUSB0 <&1
笔记:
- 这将启动一个 shell,并将输入和输出重定向到你的输出设备;
- 输入需要重定向,因为它
stty
在标准输入设备上工作,而其诊断输出仍应定向到启动终端; stty raw
停止将多余的字符添加到输出中;echo -n
在字符串末尾停止隐式换行符,同时echo -e
允许斜杠转义序列生成不可打印的字符(如果您的设备需要的话);- 并且需要一个子 shell,以便它
/dev/ttyUSB0
不会被关闭并重新打开,这可能会重置其设置。
不要重定向标准错误:您不希望将错误消息发送到设备!
我已经测试过了/dev/tty1
,它似乎可以工作,但我没有串行设备来完全验证它。我需要在 root shell 中才能使命令工作,但您的权限可能允许从用户 shell 执行该命令。
答案2
您是否尝试过简单地将 stdout 定向到 /dev/ttyUSB0 (command-that-gives-stdout > /dev/ttyUSB0)?我认为操作系统会为您处理任何缓冲和波特率转换。