我正在开发一个非常小的程序,其重量传感器连接到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秒内没有应答,则跳过读取,但如果它在200ms读取,则继续而不等待800最后ms
答案 0 :(得分:5)
以读/写模式打开设备应该可以正常工作。
exec 3<> /dev/ttyS0
echo "IDN?" >&3
read -t1 output <&3
使用exec
这样打开文件意味着文件在多个命令之间保持打开状态,而不是被每个命令打开和关闭。