none
シリアルポートの入力バッファに文字列が入った時点で読みに行くには? RRS feed

  • 質問

  • シリアルポートの通信内容によって処理を分岐したいと思っています。

    void WaitResponse(char *str){

        DWORD dwErrors;
        COMSTAT ComStat;

        char* rdBuf;
        DWORD dwRead;

        ClearCommError(hComm, &dwErrors, &ComStat);
        ReadFile(hComm, str, ComStat.cbInQue, &dwRead, NULL);
       return;
    }

    この関数を文字列の取得に用いていますが、どうやら受信前に通過してしまい文字列を正しく受け取れていないようです。入力バッファに文字が入った時点まで待つにはどうしたら良いでしょう?

    ちなみに受信用のスレッドは用意していません。<=あまり複雑にしたくない。

    SetCommMask( hComm, 0 );

    dwMask = 0;
      while(1){
       WaitCommEvent( hComm, EV_RXCHAR, NULL );
       if( dwMask & EV_RXCHAR ){
        break;
       }
      }

    とすると、無限ループに入ってしまったようで反応しなくなりました。イマイチ正しい使い方がわかりません。

    したいことは、文字列受信完了まで待て。ただそれだけです。

    何か良い方法はありませんでしょうか?

     

     

    2010年11月11日 6:07

すべての返信

  • すいません、上記のものは間違いです。

    SetCommMask( hComm, EV_RXCHAR );

    dwMask = 0;
      while(1){
       WaitCommEvent( hComm, &dwMask, NULL );
       if( dwMask & EV_RXCHAR ){
        break;
       }
      }

    それでも動いていません

    2010年11月11日 6:44
  • 確認です。

     

    COM PortからDataの読み込みが正しく動作することは確認済みでしょうか?

    WaitせずにDataをReadする処理を繰り返して、COM PortからDataが読み込めますか?

    WaitCommEventなどAPIの戻り値などから、Errorが発生していないか確認済みでしょうか?

    2010年11月11日 10:26
  • Overlapped I/O による非同期処理になっていないのが問題なのかも。。。

    ↓ 以下のサイト似たような事例があります。(この事例では、非同期処理にすることによりうまくいったみたいです。)

    http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200603/06030018.txt

    非同期処理にするには、CreateFile() API 6th パラメータ dwFlagsAndAttributes に FILE_FLAG_OVERLAPPED フラグをセットして
    COM ポートのハンドルをオープンし、ReadFile() / WriteFile() / WaitCommEvent() などの Overlapped I/O をサポートする API で
    OVERLAPPED 構造体へのポインタを渡してやればうまくいくと思います。

    2010年11月11日 10:40