vc++ では、シリアル通信に MScomm を使用しています。この形式 02120812550006050.0 でデータを受信しました。これを読み取る方法がわかりません。どの形式で、開始フレームから開始し、終了ファイルで終了しますが、わかりません。
編集1:
日時とデータが含まれており、これをどのように分離できますか
vc++ では、シリアル通信に MScomm を使用しています。この形式 02120812550006050.0 でデータを受信しました。これを読み取る方法がわかりません。どの形式で、開始フレームから開始し、終了ファイルで終了しますが、わかりません。
編集1:
日時とデータが含まれており、これをどのように分離できますか
変な文字は、レコードの開始、レコードの終了、フィールド区切りなどを示すマーカーです。実際のプロトコルを知らなければ、見分けるのは少し難しいです。
データははるかに簡単です。
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);
固定形式でない場合は、フィールド セパレータの位置を検出し、その間にあるものを抽出するコードを記述するだけです。
何と通信しているのか、どのように通信しているのかを知らなければ、それを理解することはまずありません. (ヒント -- 教えてください)