シリアルポートを介して毎秒2回連続してデータを送信するスケールがあります。このデータを読み取る唯一の信頼できる方法は、たまたまcat
コマンドでした。以下の作品:
cat /dev/ttyUSB0
ただし、cat
の問題は、EOF
を受信しないため、データの取得を続行することです。 head
、read
、tail
も試しました。
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
あなたの最善の策は、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-最初の一致後のアドレス範囲