0

vc++ では、シリアル通信に MScomm を使用しています。この形式 02120812550006050.0 でデータを受信しました。これを読み取る方法がわかりません。どの形式で、開始フレームから開始し、終了ファイルで終了しますが、わかりません。

編集1:

日時とデータが含まれており、これをどのように分離できますか

4

2 に答える 2

2

変な文字は、レコードの開始、レコードの終了、フィールド区切りなどを示すマーカーです。実際のプロトコルを知らなければ、見分けるのは少し難しいです。

データははるかに簡単です。

000f マーカーと 0002 マーカーの間には、2008 年 12 月 2 日 12:55:00 という日付/時刻フィールドがあります。

0002 と 0003 マーカーの間では、単純なフロートのように見えますが、実際にはドルの値またはその他の値である可能性があり、リンクの反対側にあるものによって異なります。

それを分離するために、何らかの可変文字配列にそれを読み取ったと仮定しています。マーカーを探して、それらの間のフィールドを抽出するだけです。

日付/時刻は固定サイズであり、値もおそらく固定されているため (先頭に 0 があるため)、おそらく memcpy を使用して必要な情報をバッファから引き出し、null で終了し、値を浮かんで、ほら。

固定形式の場合は、次のようなものを使用できます。

static void extract (char *buff, char *date, char *time, float *val) {
    // format is "\x01\x0fDDMMYYhhmmss\x02vvvvvvv\x03\x04"
    char temp[8];
    memcpy (date, buff +  2, 6); date[6] = '\0';
    memcpy (time, buff +  8, 6); time[6] = '\0';
    memcpy (temp, buff + 15, 7); temp[7] = '\0';
    *val = atof (temp);
}

そしてそれを呼び出す:

char buff[26]; // must be pre-filled before calling extract()
char dt[8];
char tm[8];
float val;
extract (buffer, dt, tm, &val);

固定形式でない場合は、フィールド セパレータの位置を検出し、その間にあるものを抽出するコードを記述するだけです。

于 2008-12-03T05:51:33.383 に答える
0

何と通信しているのか、どのように通信しているのかを知らなければ、それを理解することはまずありません. (ヒント -- 教えてください)

于 2008-12-03T05:25:47.990 に答える