web-dev-qa-db-ja.com

catがシリアルポートデータを破損している

シリアルポートにいくつかのバイトを書き込むアプリケーションがあります。私がする時 cat /dev/ttyS0何が転送されているかを確認するには、catコマンドによってデータが破損していることがわかりました。シリアルポートで何が送信されているかを確認する他の方法はありますか?

catがデータを変更する理由を誰かが知っていますか?

編集:反対側に別のアプリケーションがあり、その内容を確認するためにデータを傍受したいのですが、アプリケーションは引き続き機能する必要があります。

破損していません。何が起こっているのかというと、catコマンドがバイトの一部を取得していて、アプリケーションがそれらの一部を取得しているということです。したがって、catを実行すると、それによって読み取られたバイトはアプリによって失われ、catとアプリの両方に、破損しているように見える(異なる)部分ストリームが表示されます。

4
Jim Paris

お使いの端末(または猫が表示している場所)によってデータが破損していないことを確認しますか? catがデータを破壊する可能性はほとんどありません。

od(8進数のダンプ)を使用してシリアルポートからのデータをダンプしてみてください。そうすれば、(印刷可能であることに依存することなく)何が起こっているのかを正確に確認できます。使用する od -c ASCIIデータを期待している場合。

それでも破損が見られる場合は、シリアルポートが正しく構成されていない可能性がありますか? setserialsttyを試して、より適切に構成できるかどうかを確認してください。

9
P.T.

catはデータを変更しません。 Linuxではなくnullバイトを含む行を切り捨てる古いUnixシステムがあるかもしれませんし、最近のunixライクなシステムはないと思います。

一方、バイナリデータを端末に直接表示しようとすると、端末は制御文字を表示を制御するコマンドとして解釈します。それが制御文字の目的です。生データの印刷可能な表現を見たい場合は、いくつかの解決策があります。

  • cat -Aを実行します。これにより、制御文字の読み取り可能であいまいな表現が出力されます(たとえば、^Aはバイト0x01または2バイトシーケンス0x5e0x41である可能性があります)。
  • hexdump -Cod -t x1またはその他の16進ダンププログラム(または必要に応じて8進ダンプ)を実行します。
  • less /dev/ttyS0を実行し、Fを押してデータを読み取り、Ctrl+Cを押してデータを参照します。 lessの中には、-rと入力して、制御文字の生の表示と印刷可能な表現を切り替えます。

/dev/ttyS0を読み取ると、シリアルポートを介して送信されるものではなく、シリアルポートが受信するものが表示されることに注意してください。それが必要な場合は、作成しているアプリケーションをスパイします。 straceまたはデバッガーを使用します。