
誰かに文字列をシリアルポートに送信しようとしていますが、echo -ne '\x55\x90\x17\x01\x00' > /dev/ttyACM0
USBモニターに次のデータが表示されます。
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
各「ライン」のシステムコールが呼び出されます。echo
write()
$ 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