数分/時間後にシリアルポートで書き込みまたは読み取ることはできません。エラーメッセージ:stty:stdin:デバイスに不適切なioctl

数分/時間後にシリアルポートで書き込みまたは読み取ることはできません。エラーメッセージ:stty:stdin:デバイスに不適切な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:stdin:デバイスのioctlが不適切です。

bashスクリプトエラーstty:stdin:デバイスに不適切なioctl

この記事のおかげで、問題がsttyコマンドの-echo演算子に関連しているという結論に達しました。現在、この演算子なしでテストを実行しており、動作しているようです。今話すには早すぎるが朝。ただし、この演算子がないと、-echo光センサーから収集されたデータが正しく表示されません。演算子を使って動作させたいのですが、方法がわかりません。

-echoだから私の質問は、オペレータと連携させる方法はありますか?

これらのスクリプトのロジックについては後述する。

  1. Main_Script.sh
  2. Light_Sensors.sh
  3. テストシナリオ.sh

1) メイン_スクリプト.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し、それが何であるかを確認してください。また、グループがダイヤルアウトからルートに変更される場合も同様のようです。

関連情報