シリアル通信でデータを取得しようとしたけれど、既定のデータが取れなかった時の話です。
初心者っぽいハマり方でちょっと恥ずかしい話ですが...。同様の現象でお困りの方の参考になれば幸いです。
環境:
・Windows API
現象:
あるデータを取得しようとしたところ、56バイトあるはずのデータが25バイトしかない。
データを確認したところ「0x00」がない(イメージデータ↓)
原因:
シリアルポート設定でfNULLをTRUEに設定していた。
NGコード
/* シリアルポートを開く */
hComPort = CreateFile(com, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
// エラーチェックコード省略
/* 送受信バッファ設定 */
ret = SetupComm(
hComPort, // COMポートハンドラ
1024, // 受信バッファサイズ:1024byte
1024 // 送信バッファ:1024byte
);
// エラーチェックコード省略
ret = PurgeComm(
hComPort, // COMポートのハンドラ
PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR // 出入力バッファをすべてクリア
);
// エラーチェックコード省略
/* シリアルポートを設定する */
DCB dcb;
ret = GetCommState(hComPort, &dcb); // 現在の設定値を読み込み
// エラーチェックコード省略
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = speed; // 速度
dcb.ByteSize = 8; // データ長
dcb.Parity = NOPARITY; // パリティ
dcb.StopBits = ONESTOPBIT; // ストップビット長
dcb.fBinary = TRUE; // バイナリモード:TRUE
dcb.fNull = TRUE; // NULLバイトの破棄:破棄する ←これ
以下、省略
対応
fNullをFALSEに変更
修正
dcb.fNull = FALSE; // NULLバイトの破棄:破棄しない ←これ
結果
現場からは以上です。