0xAデータを使用して生データをシリアルに転送する

0xAデータを使用して生データをシリアルに転送する

誰かに文字列をシリアルポートに送信しようとしていますが、echo -ne '\x55\x90\x17\x01\x00' > /dev/ttyACM0USBモニターに次のデータが表示されます。

ffff8c957536f540 2932377867 S Bo:2:005:3 -115 5 = 55901701 00

これはうまくいきます。すべてのデータは文字列として送信され、デバイスはコマンドを受け入れます。ただし、データに0xAが含まれている場合、データは常に2行に分割されます。たとえば、

echo -ne '\x55\x90\xa\x01\xde' > /dev/ttyACM0

USBモニタリングは次のことを示しています。

ffff8c957536f540 3046024649 S Bo:2:005:3 -115 3 = 55900a
ffff8c957b719000 3046024661 S Bo:2:005:3 -115 2 = 01de

文字列は2行に分かれており、もちろんデバイスはこのコマンドを無視しました。

私の質問は、0xAを含むデータを送信する方法です。これはsttyに問題があります。多くの時間を費やしましたが、まだ成功していませんでした。または、Linuxコンソールからシリアルポートに文字列の途中で0xAを送信できないことを確認してください。

ベストアンサー1

これはとても似ていると思います。Bashメーリングリストで議論された問題過去数日間。 Bashは出力にラインバッファリングを使用するため、途中で改行文字を含めるか含めると、printf各「ライン」のシステムコールが呼び出されます。echowrite()

$ strace -ewrite bash -c 'echo -ne "foobar"' >/dev/null 
write(1, "foobar", 6)                   = 6
+++ exited with 0 +++

$ strace -ewrite bash -c 'echo -ne "foo\nbar\n"' >/dev/null 
write(1, "foo\n", 4)                    = 4
write(1, "bar\n", 4)                    = 4
+++ exited with 0 +++

書き込んでいるデバイスがそれに敏感である場合、複数の異なるパケットが発生する可能性があります。シリアル接続またはTCPストリーム(*)はこれを気にする必要はありませんが、UDPパケットに似たものは気にします。

Bashではこの問題を解決できないようですが、出力コマンドの途中で出力を個々の行に分割しない他のユーティリティを使用できます。私がテストした他のすべてのシェルは、write()GNU coreutilsの外部ユーティリティと同様に、単一の呼び出しで上記の内容を印刷します。 Linux上にprintfある必要があるため、機能する必要があります。/usr/bin/printf/usr/bin/printf '\x55\x90\xa\x01\xde'

$ strace -f -ewrite /usr/bin/printf '\x55\x90\xa\x01\xde' >/dev/null 
write(1, "U\220\n\1\336", 5)            = 5
+++ exited with 0 +++

または、デフォルトでは、出力を512チャンク(最後のチャンクを除く)にバッファリングする出力をパイプすることもできますdd。これはあなたの場合に十分です。 (dd obs=512この点を明確にしてください。)

(* TCP接続は問題ではありませんが、メーリングリストの質問はこれに関するものですprintf ... > /dev/tcp/...。他の書き込みはTCPストリームの断片化に影響を与える可能性があり、いくつかのバグを持つホストはそれに興味を持っているようです。)

おすすめ記事