シリアル通信エラー取得

解決


ぽっぽマン  2010-02-02 17:10:27  No: 71355  IP: [192.*.*.*]

シリアル通信を行うアプリケーションを開発しているのですが、
エラー処理について調査したのですが、自力では解決できない為、
お分かりになる方いらっしゃいましたら、どうかお力添えください。

開発環境
WindowsXP, VS2005 MFC

シリアル通信アプリを作成しており、主にサーバ側(常に待ち状態)で動作しております。
起動したら常にオープンしております。

USB変換ケーブルを指して相手と接続しているのですが、
一度、USB変換ケーブルを抜いて指し直すと通信ができなくなってしまいます。
エラーがどこかで取れるかと調査したのですが、どうしても見つかりません。
ケーブルを指し直しても自動復帰するようなソースは書けないのでしょうか?

大まかな流れとしては以下のように作成しております。
ClearCommError で取れそうな感じですが、
切断時でも何も変わりませんでした。

------------OPEN-------------------
    if ((m_hComm=CreateFile (CommName, GENERIC_READ | GENERIC_WRITE,
        0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) {
      /* handle error */
      return false;
    }
------------OPEN-------------------

------------RECEIVE-------------------
    // 受信バッファにたまったデータサイズを得る
    ClearCommError(pInst->m_hComm, &dwErrors, &ComStat);
    dwCount = ComStat.cbInQue;

    if (dwCount != 0) {
      ZeroMemory(pszBuf, RcvBufferMaxSize);
      try{
        ReadFile(pInst->m_hComm, pszBuf, dwCount, &dwRead, NULL); // 受信
      }
      catch(CException &ex){
        ex.Delete();
      }
    }
------------RECEIVE-------------------

編集 削除
tetrapod  2010-02-02 18:17:19  No: 71356  IP: [192.*.*.*]

その辺は USB-COM デバイスのドライバーの出来によっても状況が異なったりするので
A社の AA デバイスでは OK であったが
B社の BB デバイスでは NG とかそういうこともありえて、
一概にこうすれば Good ということは言えないのだが・・・

そもそも、プログラムのテクニカルな話以前の仕様として、そういうさし直しを認めるとしたら

・通信中に COM デバイスを除去してしまったら、そのとき通信していたデータはどうなればいいの?
  さし直し後にエラー時点から再開する必要があるのか?
  さし直し後に最初から通信やり直してかまわないのか?
・そのデバイスを 違う USB の口にさすと COMx の番号が変わるが、どうなればいいの?
・ COM デバイスが複数個あるとき、デバイスと COMx の対応をどう調べるつもり?
 (特に、抜き差しして COMx 番号が変わった場合)

などなどがちゃんと考察・決定済みかどうかあたりが大いに問題だと思う。

俺が USB-COM 変換器を使ったときには、仕様として
抜いたらエラー。自動復帰しない。最初からやり直す必要あり。
としておいたけど。

で、以下はテクニカルな点。
まず ClearCommError/ReadFile/WriteFile 自体の返却値を見てないのがダメ。
抜くとそういう API 呼び出し自体が全部エラーになるはず (まっとうなドライバなら)

その上で PnP 時には WM_DEVICECHANGE が飛んでくるのでそれで判定するとか・・・

編集 削除
ぽっぽマン  2010-02-04 10:15:06  No: 71357  IP: [192.*.*.*]

tetrapodさんありがとうございました。
返事が遅れて申し訳ないです。

なかなか難しい問題なんだと理解しました。

仕様が不明点を補足いたしますと

・通信中に COM デバイスを除去してしまったら、そのとき通信していたデータはどうなればいいの?
  さし直し後にエラー時点から再開する必要があるのか?
  さし直し後に最初から通信やり直してかまわないのか?

指し直すと最初から通信をやり直す。

・そのデバイスを 違う USB の口にさすと COMx の番号が変わるが、どうなればいいの?

現状のUSB変換デバイスは、同じUSBコネクタに指し直した場合はCOM番号は変わらない。

ClearCommErrorの返却値も取得して試してみたのですが、
変化なし(正常)なのでエラー認識は出来ませんでした。


以上の内容を検討するとtetrapodさんと同じ仕様で先方に
お願いしようかと思っています。

「抜いたらエラー。自動復帰しない。最初からやり直す必要あり。」


そもそもの発端はUSB変換ケーブルを抜くことはないが、
運用中にそれと同じようなことが起こった場合の対処と言うところから
始まりました。
そんなことが起こるのかも不明ですし、起こらないようにとWindows頼みでも
いいのでしょうかね。

tetrapodさんに相談できてすっきりしました。
本当にありがとうございました。

編集 削除
ぽっぽマン  2010-02-04 10:16:38  No: 71358  IP: [192.*.*.*]

すみません。
解決チェックをするのを忘れました。

編集 削除