catはシリアルからデータを読み取るための信頼できる唯一のコマンドですか?

catはシリアルからデータを読み取るための信頼できる唯一のコマンドですか?

シリアルポートを介して毎秒2回連続してデータを送信するスケールがあります。このデータを読み取る唯一の信頼できる方法はcatコマンドです。以下はうまくいきます:

cat /dev/ttyUSB0

しかし、問題catはデータを受信できないため、引き続きEOFデータをインポートすることです。私もそれを試してみましたheadreadtail

head -1 /dev/ttyUSB0 | strings

毎回「ほぼ」動作しますが、時々古いデータが表示され、catコマンドを再実行しなければ問題は修正(?)されます。パイプの後の文字列は、印刷可能なデータのみを検索します。

read line < /dev/ttyUSB0 | echo $line

データが検索されることもありますが、ほとんどは空行のみが表示されます。

tail -1 < /dev/ttyUSB0

ただ止まって待てばEOFいいのでしょうか?

bash私の問題は、データを呼び出して「読み取り」および検索できるスクリプトを書く必要があることです/dev/ttyUSB0。を使用する予定です。しかし、決して失敗しないので、出力を1行だけキャプチャしてから停止する方法があるかどうかhead疑問に思います。catcat

注:ポート設定は、9600ボーレート、1スタートビット、8データビット、パリティなし、2ストップビットです。ポートを正しく設定するには、次のコマンドを実行します。

sudo stty -F /dev/ttyUSB0 9600 -parity cs8 cstopb

ベストアンサー1

最善の方法は、ttyをrawモードに設定し、メッセージの先頭を見るまで文字を削除してから、メッセージの終わりに達するまで文字を印刷するプログラムを書くことです。 "raw"を追加した後、sttyttyfgetc()から個々の文字を取得するために使用できます。

インスタント医師:

char = fgetc(serial_port);
if char == START_CHARACTER {
    putc(char);
    for (i=0;i<MESSAGE_LENGTH;i++){
        putc(fgetc(serial_port));
    }
}

これはsedとraw ttyを使用して行うこともできます。次の質問を参照してください。 https://stackoverflow.com/questions/20943025/how-can-i-get-sed-to-quit-after-the-first-matching-address-range

おすすめ記事