プロが教えるわが家の防犯対策術!

シリアル通信で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);

A 回答 (2件)

ReadFileが正常終了しているかどうかは確かめたでしょうか。

正常終了していない場合、GetLastErrorでエラーの原因を取得して調べることができます。

また、提示されたプログラムコードは誤っておりコンパイルできません。せめてコンパイルくらいはできるコードを提示しましょう。

この回答への補足

早々のご回答ありがとうございます。
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);

補足日時:2005/11/14 13:00
    • good
    • 0

非同期通信でいいのでしょうか。


ポーリングなどをして
きちんとポートを監視してますか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています