我正在开发一个方向控制器。我有一个开发板,它通过 I2C 与传感器(指南针)通信。由于主板非常有限(没有操作系统),我开发了一个简单的程序来接收以下内容:(1)“get 0”读取传感器的寄存器 0; (2)“set 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
编辑:我不需要交互式终端。我想根据需要使用这个例程。该例程是控制器(读/写传感器寄存器)的必要基础,稍后将在电路板上实现。
为了解决(#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>&-
EDIT:为了解决(#2)问题,我将责任委托给调用者,而不是为例程提供超时支持。但是,如果超时,我们需要进行清理。为此我在之后添加了以下内容wait_pid=$!
:
trap="if kill -0 $wait_pid ; then kill -TERM $wait_pid ; fi"
trap "$trap" SIGINT SIGKILL SIGTERM
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)