Bash: 在设备上写入然后从中读取

Bash: write on device then read from it

我正在开发一个非常小的程序,其中有一个连接到 S0 的重量传感器。下面是我如何初始化串口:

stty -F /dev/ttyS0 9600 min 60 time 1 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke parenb -ixon

我已经测试了几种写入设备然后从中读取的方式:

echo IDN? >> /dev/ttyS0
read -t1 output < /dev/ttyS0   # waits for ever here.

我也试过了:

echo IDN? >> /dev/ttyS0 && read -t1 output < /dev/ttyS0  # waits too

但是没有成功。在一行中,它不会改变任何东西。

until read -t1 < /dev/ttyS0; do
    echo IDN? > /dev/ttyS0
done
identity=$(echo $REPLY | tr -d $'\r')

这在连接设备时有效。


对于我的测试,我这样做了并且有效:

$ cat /dev/ttyS0 &
[1] 9188
$ echo IDN? >> /dev/ttyS0
HBM-xxxyyyzzz$

我试过的三种方式都不成功。可能是因为设备的回答比 bash 解释的更快?如果是这样,我如何才能避免这种情况以获得设备的完美定时答复?

我实际要搜索的是,如果设备在 1 秒内没有应答,则跳过读取,但如果它在 200 毫秒读取,则继续而不等待最后 800 毫秒

在 read/write 模式下打开设备应该可以。

exec 3<> /dev/ttyS0
echo "IDN?" >&3
read -t1 output <&3

像这样使用 exec 打开文件意味着文件在多个命令中保持打开状态,而不是通过每个命令打开和关闭。