掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ReadFileで正しく受信データを取得するには? (ID:60928)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
修正をしたコードの一部です。 ポートオープン時の設定は【fAbortOnError】がtrue(初期状態)のまま、ということ以外は(falseの方がいい場合もありそうなので)大丈夫だと思われます。(パリティや速度etc) <受信スレッド内> DWORD WINAPI COM_Thread(LPVOID pData) { DWORD dEvent = 0; DWORD dError = 0; DWORD dByte = 0; DWORD dtrByte = 0; BOOL b = FALSE; COMSTAT Comstat; char cBuf[256]; memset(cBuf, 0, sizeof(cBuf)); // ★OVERLAPPED 構造体comop、revopはグローバルで宣言 comop.hEvent = CreateEvent(NULL,true, false, NULL); revop.Offset = 0; revop.OffsetHigh = 0; while(bThread) { //←スレッド稼動中はtrueであるbool型フラグ WaitCommEvent(h_Com, &dEvent, &comop); if(GetLastError() == ERROR_IO_PENDING) { // ★WaitCommEvent関数後は常にERROR_IO_PENDINGなので、 // イベント受信処理が終わるまで待つ GetOverlappedResult(h_Com, &comop, &dtrByte, true); } // エラー発生 if(dEvent & EV_ERR) { // エラー発生時、エラー通知処理を追加する予定 } // 送信完了 if(dEvent & EV_TXEMPTY) { // データ送信時、送信完了通知を受け取ったら処理をする予定 // ★1 } // 受信イベント発生 if(dEvent & EV_RXCHAR) { ClearCommError(h_Com, &dError, &Comstat); if(Comstat.cbInQue) { b = ReadFile(h_Com, cBuf, Comstat.cbInQue, &dByte, &revop); // ここで受信データを処理する予定 } } ResetEvent(comop.hEvent); } CloseHandle(comop.hEvent); return 0; } 以上です。 ★1の部分ですが、GetOverlappedResult関数を追加する前は、こちらから何かデータを送信するとそのデータが確実にテスト用アプリで受け取ってもらえなければ永久にEV_TXEMPTYイベントが起きてしまうという不具合が起きていました。(通信相手もいないのにデータを送信してしまうと・・・という意味です) ですが、とりあえずGetOverlappedResultの第四引数をtrueとして追加することで、そこで待機してくれるようなので大丈夫かな?という感じです。 (動作としてもとりあえず自分の思うようには動いてくれています、表向きだけかもしれないですが・・・) ここで、チンタラとなかなか作業が進まないせいか、通信DLLは後に回して違う作業をするようにという命令がきてしまいました・・・ まだ20バイト程度のデータのやり取りテストしかできていないので、この時点では動いてくれてるのですがこれからどうなるかわからないですし非常に心残りです。 ですが暫くはこちらの作業に熱意を傾けることができなさそうですので、暫定的に解決という形を取らせていただこうかと思います。 せっかくご助言してくださった方々、失望させてしまいましたら大変申し訳ないです。 再度こちらの作業に取り掛かれることになりましたら、きっとまた壁にぶちあたりそうですので、勝手ながらその時はどうかお力添えいただけると嬉しいです。 お時間割いてレスしてくださり、本当にありがとうございました。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.