シリアルポートにいくつかのバイトを書き込むアプリケーションがあります。cat /dev/ttyS0
送信された内容を調べると、データがコマンドによって破損していることがわかりましたcat
。シリアルポートで送信される内容を確認する他の方法はありますか?
cat
なぜデータが変更されるのかを知っている人はいますか?
編集する:反対側に別のアプリケーションがあり、データを傍受して内容を確認したいのですが、アプリケーションは引き続き機能するはずです。
答え1
端末(またはcatが表示する場所)でデータが破損していませんか? cat
データが破損する可能性が低いです。
(octaldump)を使用してシリアルポートからデータをダンプするとod
(印刷可能性に依存せず)、発生した内容を正確に確認できます。od -c
ASCIIデータが必要な場合に使用します。
それでも破損が発生した場合、シリアルポートが誤って設定されている可能性がありますか?より適切に設定できることをsetserial
確認してください。stty
答え2
cat
データは変更されません。 NULLバイトを含む行を切り捨てる古いUnixシステムがあるかもしれませんが、Linuxはそうではなく、現代のUnixに似たシステムはないと思います。
一方、バイナリデータを端末に直接表示しようとすると、端末は制御文字を表示を制御するコマンドとして解釈します。これが制御文字の目的です。生データの印刷可能な表現を表示するには、次のようないくつかの解決策があります。
- Run
cat -A
は読み取ることができますが、制御文字のあいまいな表現を印刷します(たとえば、^A
バイト0x01または2バイトシーケンス0x5e 0x41)。 - を実行する
hexdump -C
か、od -t x1
別の16進ダンププログラム(または必要に応じて8進ダンプ)を実行してください。 - 実行して押す
less /dev/ttyS0
と、F
一部のデータを読み込んでCtrl+C
閲覧できます。 Less内で入力すると、-r
制御文字の元の表示と印刷可能な表示が切り替わります。
読み取りには、/dev/ttyS0
シリアルポートを介して送信された内容ではなく、シリアルポートで受信された内容が表示されます。これを行うには、たとえばstrace
デバッガを使用して作成中のアプリケーションを監視します。
答え3
破損していません。何が起こっているかは、コマンドがいくつかのcat
バイトを取得し、アプリケーションがそのバイトの一部を取得することです。したがって、実行すると、cat
アプリケーションは読み取ったバイトの両方を見逃し、cat
アプリケーションとアプリケーションの両方がストリームの(他の)部分が破損しているように見えます。