我正在开发一个非常小的程序,其中有一个连接到 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 毫秒
最佳答案
以读/写模式打开设备应该可以。
exec 3<> /dev/ttyS0
echo "IDN?" >&3
read -t1 output <&3
像这样用 exec
打开文件意味着文件在多个命令中保持打开状态,而不是被每个命令打开和关闭。
关于Bash:在设备上写入然后从中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32968728/