VC++のシリアル通信で取得したデータを数値データとして使いたいのですがどうしたらよい
のでしょうか?ちなみに現在のプログラムは以下のとおりです。
/上記略/
DCB dcb;
GetCommState(hComm, &dcb); /* DCB を取得 */
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = EVENPARITY;
dcb.fParity = TRUE;
dcb.StopBits = ONESTOPBIT;
SetCommState(hComm, &dcb); /* DCB を設定 */
DWORD dwErrors;
COMSTAT ComStat;
DWORD dwCount;
char ReadBuffer[10];
char *pszBuf=ReadBuffer;
DWORD dwRead;
ClearCommError(hComm, &dwErrors, &ComStat);
dwCount=ComStat.cbInQue;
ReadFile(hComm, pszBuf, 10, &dwRead, NULL);
getchar();
CloseHandle(hComm);
ReadBufferが取得したデータですか?
取得したデータの中身がどうなっているか分からないと、
どう扱ってよいかも分かりません。
数値データ等の前に、どのような電文を受信するのかを書いておかないと
他の人にはわからないと思います。
例えば、10バイトのデータを受信し、これがアスキーコードとして、
INT、又は、FLOATに変換する等
又、通信を行う場合は、異常処理を含めてプロトコルを決めておく必要が
ありますが、どのようなプロトコルなのですか?
PICから出力した2バイトの数値データをVC++で数値として入力することを望んでいま
す。また以下の部分はこのままでよいのでしょうか?
char ReadBuffer[10];
char *pszBuf=ReadBuffer;
2バイトの数値データといってもいくつも考えられます。
1) 数値を2桁の文字列表記
2) 下位バイト、上位バイトの順に並べた2進表現(リトルエンディアン)
符号付き、符号なしの2パターンあります。
3) 上位バイト、下位バイトの順に並べた2進表現(ビッグエンディアン)
符号付き、符号なしの2パターンあります。
4) その他あまり一般的でない表現方法
1)なら 2文字ずつ切り出してatoi()で変換してください。
2)の符号付きなら、
short* nums = (short*)ReadBuffer;
とすれば、そのまま数値配列として参照できます。
符号なしなら unsigned shortを使ってください。
3)なら、例えば最初の2バイトについては、
int num = ((unsigned char)ReadBuffer[0]<<8)|(unsigned char)ReadBuffer[1];
とこのように、状況によっていろいろ変わりますので、
外部とデータをやり取りするプログラムに関わるのであれば、
その構造をしっかり意識しておくべきです。
(データを送る側と受ける側で勘違いがあって後々問題になったりしますし:-)
2バイトのデータですが、受信タイミングをはかるためせめてSTX、ETX
ぐらいのプロトコルぐらいは作っておかないと、受信するタイミングで、上位
データか下位データかの判断ができなくなるので注意が必要です。
[STX(02h)]+データ部+[ETX(03h)]
返事が遅れてすみません。何とか問題が解決できました。
dairygoodsさん、アイススケーターさん
いろいろとアドバイスありがとうございました。
みなさん、ありがとうございました。