1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

シリアル受信データに「0」がない

Last updated at Posted at 2024-03-13

シリアル通信でデータを取得しようとしたけれど、既定のデータが取れなかった時の話です。
初心者っぽいハマり方でちょっと恥ずかしい話ですが...。同様の現象でお困りの方の参考になれば幸いです。

環境:

・Windows API

現象:

あるデータを取得しようとしたところ、56バイトあるはずのデータが25バイトしかない。
データを確認したところ「0x00」がない(イメージデータ↓)
image.png

原因:

シリアルポート設定で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バイトの破棄:破棄しない ←これ

結果

「0x00」のデータも受け取れるようになりました↓
image.png

現場からは以上です。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?