あなたの習慣について教えてください!!

シリアルポートでバイナリを非同期で送信するプログラムを作成しています。
以下のソースで実行すると、「重複したI/O処理を実行しています」というエラーがでました。
何が間違っているのか分りません・・。
どうかご指摘お願いします。

void CMyDlg::OnReset()
{
//COMポートオープン
HANDLE hCom;
hCom = CreateFile(
"COM4",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL
);

//通信設定
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
SetCommState(hCom,&dcb);

OVERLAPPED old;
// オーバーラップ構造体の初期化
ZeroMemory( &old, sizeof(old) );
old.Offset = 0;
old.OffsetHigh = 0;
old.hEvent = NULL;

//データ送信
char wbuf[7] = {0x02,0x00,0x01,0x00,0x31,0x15,0x12};
DWORD wbyte;
WriteFile(hCom,wbuf,sizeof(wbuf),&wbyte,&old);

//エラーコード取得&文字列に変換&表示
LPVOID lpMessageBuffer;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),//エラーコード取得
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMessageBuffer,
0,
NULL );
MessageBox((LPCTSTR)lpMessageBuffer); //メッセージボックス
LocalFree( lpMessageBuffer );

//COMポートクローズ
CloseHandle(hCom);
}

A 回答 (2件)

CreateFileでFILE_FLAG_OVERLAPPEDを指定すると、ファイルI/Oの時間のかかる処理にはERROR_IO_PENDINGが返るようになります。


実際に処理が完了すると、OVERLAPPED構造体のhEventがシグナル化するので、このイベントを待機することで処理完了の判断を行えます。

以下、簡単に記述方法を載せます。

// OVERLAPPED 構造体の初期化部分
old.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);

~~~

// データ送信部分
WriteFile(....);
DWORD err = ::GetLastError();
if (ERROR_IO_PENDING != err) {
  // ペンディング以外の時は失敗。エラー処理。
}

// イベントがセットされるまで待機する
// (ここでは仮に無限待ち/実際にはタイムアウトを指定する)
DWORD res = ::WaitForSingleObject(old.hEvent, INFINITE);

// Overlapped操作の結果を取得する
DWORD len = 0;
if (! ::GetOverlappedResult(hCom, &old, &len, TRUE)) {
  // 失敗
}

// ここまでで、送信が完了です。
~~~
    • good
    • 0
この回答へのお礼

有難うございました。
問題解決しました。

お礼日時:2008/05/14 12:35

別の質問で既に回答が出ていますね。


無視してください。
申し訳ありませんでした。
    • good
    • 0

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


おすすめ情報