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
打开文件意味着文件在多个命令中保持打开状态,而不是通过每个命令打开和关闭。
我正在开发一个非常小的程序,其中有一个连接到 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
打开文件意味着文件在多个命令中保持打开状态,而不是通过每个命令打开和关闭。