web-dev-qa-db-ja.com

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とデータを取得します。 headを使用します。しかし、cat出力の1行のみをキャプチャして停止する方法がある場合、catは決して失敗しないので、私は不思議に思っています。

注:ポート構成は、9600ボー、1スタートビット、8データビット、パリティなし、2ストップビットです。ポートを適切に設定するには、次のコマンドを使用します。

Sudo stty -F /dev/ttyUSB0 9600 -parity cs8 cstopb
4
thejavo

あなたの最善の策は、ttyをrawモードに置き、メッセージの先頭が見えるまで文字を破棄し、メッセージの最後に達するまで文字を出力するプログラムを書くことです。 sttyに「raw」を追加すると、ttyでfgetc()を使用して単一の文字を取得できます。

袖口のシュードオフ:

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-最初の一致後のアドレス範囲

1
KJ4IPS