几分钟/小时后无法从串行端口写入/读取。错误消息:stty:标准输入:设备的 ioctl 不合适

几分钟/小时后无法从串行端口写入/读取。错误消息:stty:标准输入:设备的 ioctl 不合适

我正在尝试同时从串行端口写入和读取。其目的是通过连接到串行端口的 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操作员一起工作吗?

以下概述了这些脚本中的逻辑。

  1. Main_Script.sh
  2. Light_Sensors.sh
  3. 测试场景.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 时,这似乎是正确的。

相关内容