我正在开发一个定向控制器。我有一个开发板,通过I2C与传感器(指南针)通信。因为电路板非常有限(没有操作系统),所以我开发了一个简单的程序来接收以下内容:(1)'get 0'来读取传感器的寄存器0; (2)'设置0 10'将传感器的寄存器0设置为值10.对于每种情况,电路板返回:(1)'完成:10' (寄存器0的值为10); (2)'完成。'; (3)'错误:......'如果有错误。有了这个,我正在尝试开发一个shell脚本(bash)来发送命令和检索数据,以便了解传感器并开发控制器。
我的问题是以下代码:
# read device output in the background.
head -n 1 /dev/ttyUSB0 &
head=$!
# (#1): without the following stmt I get:
# head: cannot open `/dev/ttyUSB0' for reading: : Protocol error
sleep 0.1
# send command to the device.
echo "get 0" > /dev/ttyUSB0
# (#2) wait for head.
while kill -0 $head 2>/dev/null ; do : ; done
我猜(#1)是由'head'和'echo'之间的读/写冲突引起的,但我不知道为什么,我不知道如何解决它。
另一个问题是(#2)我想使用超时。我尝试过类似的东西:
timeout 1 bash -c "while kill -0 $head 2>/dev/null ; do : ; done"
但是我得到:Timeout: aborting command ``bash'' with signal 9
并且程序卡住了。
顺便说一下,在执行上面的代码之前,我用以下内容初始化串口:
stty -F /dev/ttyUSB0 9600 cs8 -cstopb
编辑:我不想要一个交互式终端。我想在必要时使用这个例程。该例程是控制器(读/写传感器的寄存器)的必要基础,稍后将在电路板中实现。
答案 0 :(得分:0)
要解决(#1)我修改了例程以使用fd:
# $1: the device filename, eg. /dev/ttyS0
# $2: number of lines to read before exit.
exec 3<>$1
head -n "$2" 0<&3 &
wait_pid=$!
cat - 1>&3
wait $wait_pid
exec 3>&-
编辑:要解决(#2),我不会向例程提供超时支持,而是将该职责委托给调用者。但是,如果超时,我们需要清理。为此,我在wait_pid=$!
之后添加了以下内容:
trap="if kill -0 $wait_pid ; then kill -TERM $wait_pid ; fi"
trap "$trap" SIGINT SIGKILL SIGTERM