• ベストアンサー

シリアル通信の受信待ちについて

シリアル通信で10Byte受信するまで待ち続けたいのですが、0ByteでReadFileが抜けてしまいます。 ReadFileの最後のパラメタが、NULLならば第3パラメタの値まで待ち続けると思っていたのですが、なにか設定が足りないのでしょうか? タイムアウト値は0にしています。(色々変えて見ましたが同じでした) HANDLE hComm; /* シリアルポートのハンドル */ DCB dcb; char* pszBuf="1234567890"; /* 書込・読込領域 */ hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); GetCommState(hComm, &dcb); /* DCB を取得 */ dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.ReadIntervalTimeout = 100; dcb.ReadTotalTimeoutMultiplier = 0; dcb.ReadTotalTimeoutConstant = 0; dcb.WriteTotalTimeoutMultiplier = 10; dcb.WriteTotalTimeoutConstant = 500; SetCommState(hComm, &dcb); /* DCB を設定 */ DWORD dwRead; /* ポートから読み出したバイト数 */ ReadFile(hComm, pszBuf, 10, &dwRead, NULL);

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

ReadFileが正常終了しているかどうかは確かめたでしょうか。正常終了していない場合、GetLastErrorでエラーの原因を取得して調べることができます。 また、提示されたプログラムコードは誤っておりコンパイルできません。せめてコンパイルくらいはできるコードを提示しましょう。

poohpiglet2
質問者

補足

早々のご回答ありがとうございます。 ReadFileは正常終了していますが、 ポートから読み出したバイト数は「0」です。 コンパイルエラーは、タイムアウト設定の処理を コピーし忘れていました。 HANDLE hComm; /* シリアルポートのハンドル */ DCB dcb; char* pszBuf="1234567890"; /* 書込・読込領域 */ hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); GetCommState(hComm, &dcb); /* DCB を取得 */ dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(hComm, &dcb); /* DCB を設定 */ // タイムアウト設定 COMMTIMEOUTS to; to.ReadIntervalTimeout = 0; to.ReadTotalTimeoutMultiplier = 0; to.ReadTotalTimeoutConstant = 0; SetCommTimeouts(hComm,&to); DWORD dwRead; /* ポートから読み出したバイト数 */ DWORD dwErrors; /* エラー情報 */ COMSTAT ComStat; /* デバイスの状態 */ ClearCommError(hComm, &dwErrors, &ComStat); ReadFile(hComm, pszBuf, 10, &dwRead, NULL);

その他の回答 (1)

  • FAY
  • ベストアンサー率49% (95/193)
回答No.2

非同期通信でいいのでしょうか。 ポーリングなどをして きちんとポートを監視してますか?

関連するQ&A