我有一个设备,即 /dev/ttyACM0。我可以“屏幕”到此设备screen /dev/ttyACM0
并与设备交互。我需要能够编写脚本来发送一个简单命令并捕获响应。该命令很简单,例如键入“ver”并按回车键,设备会以数字版本值进行响应。它在屏幕上工作。
我正在尝试用 bash 编写这个脚本,但似乎无法弄清楚如何让它工作。类似的东西什么echo "ver" > /dev/ttyACM0
也没产生。我试过打印,结果还是一样。有人能告诉我怎么做吗?
答案1
在 Unix/Linux 中,一切都是文件。每次您向设备 (/dev) 发出回显时,您都是在打开设备以进行写入,然后写入并关闭。捕获设备输出的简单方法很简单,如下所示
tail -f /dev/ttyACM0 (-f 保持线路畅通)
这将捕获输出并保持设备打开。
例如,在我的例子中,我有一个项目,它读取 Arduino 中的传感器,并同时将信息发送到服务器和串行端口。
现在,串行 tty 需要匹配操作系统和设备上的速度。因此,有时除非您具有正确的速度和设置,否则您无法获得输出。如果您在终端中输入
stty /dev/ttyACM0
您将获得当前的速度配置。
因此,您可以尝试以下方法(但并不总是有效)
已更新++
#!/bin/bash
input="/dev/ttyACM1" #sets the device
stty -F $input 115200 min 0
#added to initialize the line
stty -F $input -brkint -icrnl -imaxbel -opost -onlcr -isig
stty -F $input -icanon -iexten -echo -echoe -echok -echoctl -echoke
echo "ver" >>$input #send the command
tail -f $input & #reads and wait for ever
sleep 2s
killall tail #Could be an issue if other tail running
在我的情况下,shell 输出这个(它不会接受 ver 命令,因为它没有被实现,但是之后从 tty 读取 tty 发送的任何内容)。随着变化,尾部提前停止,输出在 2 秒时被截断
1970-00-00-00:00:00: Init SDCard...
1970-00-00-00:00:00: SDCard Init done.
1970-00-00-00:00:00: Reading configuration...
1970-00-00-00:00:00: Done...
1970-01-01-00:00:01: IP: 192.168.22.199
再次,-f 标志使终端保持打开状态,但如果我将其关闭,我将什么也得不到(我丢失了缓冲区输出)
这就是为什么我认为小型 C 程序会做得更好的原因。
希望这可以帮助。
答案2
许多设备访问问题可以通过组成员身份变更来解决。
具体来说,如果ls -l
显示组权限(第二个“ rwx
”三元组)为“ rw
”(例如“ -rw-rw----
”),那么将自己添加到拥有该设备的组将授予rw
访问权限。
就是这样:
device="/dev/ttyACM0"
sudo adduser $USER $(stat -c "%G" $device)
这允许您成为可以使用该设备的组的成员rw
,但还有一个步骤。
要使所有进程成为新组的成员,请注销并登录。组成员资格是按时设置的login
。
要在新组中创建单个进程(用于测试,在注销/登录之前):
newgrp $(stat -c "%G" $device)
或者,只需键入组名。请参阅man newgrp
。