シリアルポートを介して毎秒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
。を使用する予定です。しかし、決して失敗しないので、出力を1行だけキャプチャしてから停止する方法があるかどうかhead
疑問に思います。cat
cat
注:ポート設定は、9600ボーレート、1スタートビット、8データビット、パリティなし、2ストップビットです。ポートを正しく設定するには、次のコマンドを実行します。
sudo stty -F /dev/ttyUSB0 9600 -parity cs8 cstopb
答え1
最善の方法は、ttyをrawモードに設定し、メッセージの先頭を見るまで文字を削除してから、メッセージの終わりに達するまで文字を印刷するプログラムを書くことです。 "raw"を追加した後、stty
ttyfgetc()
から個々の文字を取得するために使用できます。
インスタント医師:
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