我目前正在使用 Linux 文件描述符通过串行端口与外部设备进行通信,我想知道我是否可以复制返回设备的结果。
具体来说,我使用文件描述符号 5 来读取和写入 raspbian 设备中的串行端口 /dev/ttyACM0。
exec 5<>"/dev/ttyACM0"
在后台,我运行了一个函数,每当出现响应时就会从端口连续读取数据,以决定下一步。
function __processing__(){
local line
while read line<&5; do
... some processing ...
... echo $line > "log.txt"
done
}
如果我只是向串行端口发送单个命令并让后台函数处理响应,它就可以正常工作。当我开始使用其他软件在前台使用 XMODEM 协议传输数据时,出现了该问题。
sx -vv -k "./firmware_update.bin" >&5 <&5
尽管日志文件中记录了 ACK 响应,但进程在 ACK 上始终超时。所以我怀疑是因为后台进程读取了FD5,sx
什么也没留下。然后我尝试删除后台进程并仅运行命令sx
,当它成功发送所有数据包时,我的怀疑得到了证实。
但随后我没有任何来自串行端口的记录响应来实际知道下一步该做什么。
所以我的问题是:有没有办法重写后台函数,以便它仍然可以读取响应,而不干扰sx
?我知道我们可以使用tee
命令从 stdout 复制数据,我可以用 FD5 实现类似的效果吗?
P/s:这是我第一次在 Linux 中使用文件描述符和管道,所以我不知道很多重定向输出的技术。谢谢大家。