アプリ版:「スタンプのみでお礼する」機能のリリースについて

シリアルポートで非同期でバイナリを送信するプログラムを作成しています。
以下のソースでバイナリを送信したつもりなのですが、本当に送信できているのか分りません。
送信が完了したのか確認するにはどうしたいいでしょうか?
よろしくお願いします。
COMのオープン、DCBの設定は恐らく問題ないので、
WriteFileの周辺を抜粋します。

OVERLAPPED old;
ZeroMemory( &old, sizeof(old) );
old.Offset = 0;
old.OffsetHigh = 0;
old.hEvent = NULL;

char wbuf[7] = {0x02,0x0C,0x01,0x00,0x31,0x15,0x1A};
DWORD wbyte;
if(!WriteFile(hCom,wbuf,(DWORD)sizeof(wbuf),&wbyte,&old)){
if(ERROR_IO_PENDING == GetLastError()){
GetOverlappedResult(hCom,&old,&wbyte,TRUE);
}
else MessageBox("エラー");
}

A 回答 (1件)

WriteFileのリファレンスはちゃんと読まれましたか?



オーバーラップをつかって書き込んだ場合hFileのオープン時にFILE_FLAG_OVERLAPPDを指定し、lpOverlappedに有効なポインタが渡された場合 WriteFileは 0を返します
この時点では まだ転送が完了していないので GetLastErrorもERROR_IO_PENDINGを返し、まだデータ転送が終わっていないことを示します

転送できたどうかは GetOverlappedResultで取得するのですよ

本来ならhEventにCreateEventで作成したハンドルを設定しておいて
WaitForSingleObjectなどでこのイベントハンドルがシグナル状態になるのを待機して、待機が解除されたらGetOverlappedResultで確認
といった手法でしょう

本当にオーバーラップが必要なのでしょうか?
通信相手のマニュアルにはサンプル例などがないのでしょう …
    • good
    • 0
この回答へのお礼

イベントを使って確認できました。
適切なアドバイス有難うございました!

お礼日時:2008/05/14 16:16

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