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ストリームの断片化に影響を与える可能性があり、いくつかのバグを持つホストはそれに興味を持っているようです。)

答え2

これは、データが2行に「分割」されるという意味ではありません。

つまり、データを正しく書き込んでいます。これがデータを表示する方法であり、「2行」があるようです。

0xAは、UNIX / Linuxの「改行」文字(「\ n」)であるASCII「改行」文字です。

USBモニターでデータを表示すると、端末(またはUnix / Linuxのほとんどすべてのテキスト表示ソフトウェア)はディスプレイを次の「行」に移動します。ほとんどの端末では、これはディスプレイドライバがキャリッジリターンとラインフィードを挿入することを意味します。

odデータを確認するより良い方法は、USBモニターからデータをキャプチャし、表示オプションを使用してコマンドにパイプすることです。16進文字od -t x1)。これにより、作成した実際のデータが表示されます。

答え3

一部のttyデバイスは、LFからCRLFへの変換出力をオンのままにします。以下を使用して無効にできます。

stty -onlcr -F /dev/ttyACM0

または厳格なPOSIX滞在の場合

stty -onlcr < -F /dev/ttyACM0

または、純粋なRAWモードを試してください。

stty raw -echo -F /dev/ttyACM0

それでは試してください。

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

関連情報