罠

正常に読み取られるたびに、RFIDタグの一意のIDをLinux(Raspberry Pi)ボックスのシリアルポートに送信するRFIDリーダーがあります。問題は改行文字なしで送信されることです。以下は出力の例です。

root@scalepi:~/scale# ./grabserial -d "/dev/ttyUSB4" -b 9600 
$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#$A0112OKD9990001200005643E#

次の新しい行を使用して、各項目をテキストファイルに書きたいと思います。

$A0112OKD9990001200005643E#
$A0112OKD9990001200005643E#
$A0112OKD9990001200005643E#

ご覧のとおり、各項目は$で始まり、#で終わります。

この行を使用して出力をsedにパイピングし、#の後に新しい行を追加しようとしましたが、sedがデータを処理する前に新しい行を探していたと思ったので、出力は0でした。

./grabserial -d "/dev/ttyUSB4" -b 9600 | sed 's/#/#\r\n/g'

出力をファイルにリダイレクトしてから、同じsedコマンドを使用してそのファイルをキャットすると、期待した結果が得られますが、読みやすいようにこの形式でファイルにデータを書き込むことができるはずです。リアルタイム。

root@scalepi:~/scale# ./grabserial -d "/dev/ttyUSB4" -b 9600 > /tmp/test2.txt
^C
root@scalepi:~/scale# cat /tmp/test2.txt | sed 's/#/#\r\n/g'
$A0112OKD9990001200005643E#
$A0112OKD9990001200005643E#
$A0112OKD9990001200005643E#
root@scalepi:~/scale# 

誰でも私に何か提案があればとても感謝します。ありがとうございます!

編集 - 更新

以下の「tr」ソリューションを試した後にライブ出力を取得できますが、パイプを介してリダイレクトするかstdout / stderrを介してリダイレクトしようとすると、行を取得するのではなく、一度に50〜60行のバッファリング結果が得られます。バイライン結果。

次のコマンドは、シリアルポートに入るとリアルタイム出力を提供します。

./grabserial -d "/dev/ttyUSB4" -b 9600 | tr '#' '\n'

次のコマンドは一度に50〜60行ずつ出力します(リアルタイムではありません)。

./grabserial -d "/dev/ttyUSB4" -b 9600 | tr '#' '\n' | sed -u 's/$/#\r/g'

次のコマンドは、一度に50行または60行(リアルタイムではない)テキストファイルとして出力します。

./grabserial -d "/dev/ttyUSB4" -b 9600 | tr '#' '\n'  > /tmp/test1.txt

FWIW、 "grabserial"の代わりにシリアルポートを読み取るには、catを使用して同じ結果を得ました。

次のコマンドはリアルタイム結果を提供します。

cat /dev/ttyUSB4 | tr '#' '\n' 

ただし、パイプまたはstdoutリダイレクトを介して出力をリダイレクトしようとすると、テキストファイルにバッファリングされたデータの塊が表示されます。

cat /dev/ttyUSB4 | tr '#' '\n' > /tmp/test4.txt

ベストアンサー1

#文字を改行文字に翻訳(または音訳)できます。

 tr '#' '\n'

だから

./grabserial -d "/dev/ttyUSB4" -b 9600 | tr '#' '\n'

君に与えなければならない

$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E
$A0112OKD9990001200005643E

リアルタイム。もしあなたなら必要ポンド記号および/またはキャリッジリターンを使用すると、上記の内容をパイプで接続できます。

        … sed 's/$/#\r/'

(行の終わりを示すという事実をsed(そして通常は正規表現を)使用してください。$

tr出力がパイプまたはファイルに入ると、出力のバッファリングに問題がある可能性があります。おそらくこれを処理するための最良の方法は、次のことです。アルファのアドバイス たとえば、バッファリングをオフにしますstdbuf

./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' | sed 's/$/#\r/' > RFIDs.txt

明確でない場合、オプションはstdbuf小文字o(oh)と大文字L(ell)であり、これは標準出力をラインバッファリングする必要があることを示します。

結論(TL; DR)#1:

だからあなたは利用可能でなければなりません

./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' > RFIDs.txt

#最後にアイテムがないアイテムをインポートするか、

./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' | sed 's/$/#/' > RFIDs.txt

#を含むアイテムをインポートする含まれていない\rまたは最後にアイテムをインポートする

./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' | sed 's/$/#\r/' > RFIDs.txt

入場する# そして\r最後にあります。

結論(TL; DR)#2:

注文をどのように終了するのか教えてくれませんでした。Ctrl+を入力するC可能問題1の原因。その場合は、以下を試してください。

  • 上記のコマンドラインのいずれかをバックグラウンドに配置して&から使用してください。
  • 終了する準備ができたら、aを実行してpsプロセスのPIDを取得しgrabserial
  • 命令で殺すkill

結論(TL; DR)#3:

リアルタイムでデータを読み取ることができるはずですが、詳しく説明する必要はありません。 stdinで読むことができるプログラム/スクリプトがある場合は、以下を試してください。

./grabserial -d "/dev/ttyUSB4" -b 9600 | stdbuf -oL tr '#' '\n' | stdbuf -oL tr '#' '\n' | stdbuf -oL tr '#' '\n' | sed 's/$/#\r/'TシャツRFIDs.txt | あなたのプログラム 

データをプログラムに転送するときは、出力ファイルにデータを書き込む必要があります。

結論(TL; DR)#4:

実際には、catとがうまく機能している場合は、grabserial実際にはどちらも必要ありません。

stdbuf -oL tr '#' '\n' < /dev/ttyUSB4 | sed 's/$/#\r/' > RFIDs.txt

また、うまく動作する必要があります。
____________
1あなたのアップデートによると、これはあなたの問題ではないかもしれませんが、他の人に役立つようにここに残しています。


trこれは基本的に1対1ベースで機能することに注意してください。 (少し派手な操作を実行するオプションもあります。)たとえば、

tr 'abc…' 'ABC…'

、、、、などaに置き換えられます。だからあなたはAbBcCできない次のようなことをする

tr '#' '#\r\n'

おすすめ記事