我正在尝试同时从串行端口写入和读取。其目的是通过连接到串行端口的 DIO 卡打开和关闭设备。在进行这些开/关测试时,我还需要从也连接到 DIO 卡的光传感器收集一些数据。
通常,最初的几分钟/小时一切都会按预期进行。我可以向 DIO 卡发送命令,它们会被执行,同时我可以读取光传感器数据。不幸的是,几分钟/几小时后它停止工作,我根本无法通过端口发送任何命令。
串口设置:
我使用以下串行端口设置:sudo stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb -echo
当我尝试在终端中发送命令时,收到以下错误消息:bash: /dev/ttyUSB0: Permission denied
当我尝试通过 读取串行端口设置时stty < /dev/ttyUSB0 command
,我收到以下错误消息:stty: standard input: Inappropriate ioctl for device
。
我还注意到,当发生此错误时,串行端口设置会被更改。在终端中输入以下命令时我注意到了这一点:ls -la /dev/ttyUSB0
当一切正常时,我得到以下输出:
crw-rw---- 1 root dialout 188, 0 Nov 8 11:12 /dev/ttyUSB0
错误发生后,我得到类似这样的信息(我忘记保存确切的输出了):
rw-rw-rw- 1 root root 8, 0 Nov 8 11:12 /dev/ttyUSB0
文件描述符丢失,所以这可能是我之后无法发送任何命令的原因......
到目前为止我已经尝试过:
到目前为止,我只尝试更改串行端口设置。我基本上已经从能够从串行端口写入和读取的程序中复制了设置。不幸的是问题仍然存在。
我也知道相关问题。
回声测试| stty -echo -> stty:标准输入:设备的 ioctl 不合适
bash 脚本错误 stty:标准输入:设备的 ioctl 不合适
感谢这些帖子,我得出的结论是,问题与 stty 命令中的 -echo 运算符有关,我目前正在没有此运算符的情况下运行测试,并且它似乎正在工作,尽管现在下结论还为时过早。然而,由于没有这个-echo
操作符,从光传感器收集的数据无法正确显示,我想让它与操作符一起工作,但我根本不知道如何操作。
所以我的问题是有什么办法让它与-echo
操作员一起工作吗?
以下概述了这些脚本中的逻辑。
- Main_Script.sh
- Light_Sensors.sh
- 测试场景.sh
1)Main_Script.sh
#!/bin/bash
sudo stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb -echo
gnome-terminal -e ./Light_Sensor.sh
for ((countOuter=1;countOuter<=$testRunsOuter;countOuter++))
do
for ((countInner=1;countInner<=$testRunsInner;countInner++))
do
./Test_Scenario.sh
done
done
2)Light_Sensor.sh
#!/bin/bash
while read -r line < /dev/ttyUSB0; do
timestamp=$(date +%T.%3N)
echo "$timestamp || $line" | sed -E 's/(DO[0-9]=[0-9];|ADC5.+ADC8=[0-9]*mV;)//g' >> $devicesFolder/lightSensor_log.txt
echo $line
idOfMainScript=$(ps -aux | grep -E "\/bin\/bash.+Main_Script\.sh")
if [[ -z $idOfMainScript ]]; then
break
fi
done
printf "adc-loop;" > /dev/ttyUSB0
3)测试_场景.sh
#!/bin/bash
printf "DO1=1;" > /dev/ttyUSB0
sleep 50
printf "DO1=0;" > /dev/ttyUSB0
答案1
您可能会无意中覆盖字符设备 /dev/ttyUSB0,使其本质上成为常规文件。失败后对其进行检查file /dev/ttyUSB0
,看看它是什么。此外,当组从 dialout 更改为 root 时,这似乎是正确的。