写入设备并捕获响应

写入设备并捕获响应

我有一个设备,即 /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

相关内容