0

Linux のシリアル ポートからデータを読み取るプログラムを作成しています。データは、次のフレーム形式で別のデバイスから送信されます。


|start | Command | Data               | CRC  | End |
|0x02  | 0x41    | (0-127 octets)     |      | 0x03|
----------------------------------------------------

Data フィールドには、示されているように 127 オクテットが含まれており、オクテット 1,2 には 1 つのタイプのデータが含まれています。オクテット 3,4 には別のデータが含まれています。これらのデータを取得する必要があります。

Cでは、1 バイトは 1 文字しか保持できず、フレームの開始フィールドでは、3 文字の STX を意味する 0x02 であるためです。

だから、私のプログラムをテストするために、

送信側では、上記のようにフォーマットされたフレームとして配列を作成します。


char frame[254];
frame[0] = 0x02; // starting field
frame[1] = 0x41; // command field which is character 'A'
..so on..

そして、受信側では、次のようなフィールドを取り出します。

char 結果[254];
// データを読む
読み取り (結果);
printf("コマンド = %c", 結果[1]); // フレームのコマンド フィールドを取得します

// 他のフィールドの値を取得

コマンド フィールドの値 (result[1]) が文字「A」ではありません。

これは、フレームの最初のフィールド値が 0x02 (STX) であり、配列フレームの最初の 3 つの場所を占め、受信側で間違った結果をもたらすためだと思います。

どうすれば問題を解決できますか、または送信者側で何か間違ったことをしていますか?

関連する質問:
C でデータ フレームを解析して読み取りますか?
CのLinuxのシリアルポートでデータをクリアしますか?

4

1 に答える 1

0

プログラムに実際に含まれている場合

read(result);

次に、追加する必要があります

#include <unistd.h>

の関数プロトタイプを取得しますreadopen次に、シリアル ポートに接続し、結果のファイル記述子をreadバッファーと共に渡す必要があります。これにより、何を読み取るかがわかります。man 2 readおよびを参照してくださいman 2 open

于 2010-03-28T04:16:35.423 に答える