0

com0comで作成されたシリアル ポートに書き込まれたデータを読み込もうとしています。現在の構成には、相互に接続された COM8 と COM9 という 2 つのシリアル ポートがあります。

PuTTYを使用してこれら 2 つのシリアル ポートを開き、一方の端末に何かを書き込むと、すぐに他方の端末に表示されます。ただし、プログラムで実行しようとすると、話は別です。

書き込みは問題なくできますが、何らかの理由で読み取りに失敗します。Tom Archer と Rick Leinecker による CSerial ライブラリを使用しています。

データを読み込む関数は以下のようなものです。

int CSerial::ReadData( void *buffer, int limit )
{
    if( !m_bOpened || m_hIDComDev == NULL ) 
        return( 0 );

    BOOL bReadStatus;
    DWORD dwBytesRead, dwErrorFlags;
    COMSTAT ComStat;

    SetCommMask (m_hIDComDev, 0);
    SetCommMask (m_hIDComDev, EV_RXCHAR);
    ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
    if( !ComStat.cbInQue ) return( 0 );

    dwBytesRead = (DWORD) ComStat.cbInQue;
    if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit;

    bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
    if( !bReadStatus ){
        if (GetLastError() == ERROR_IO_PENDING ){
            WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
            cout<< "Read data" << endl;
            return( (int) dwBytesRead );
        }
        return( 0 );
    }
    return( (int) dwBytesRead );
}

プログラムが次の行で終了するため、シリアル ポートからデータを読み取ることができません。

if( !ComStat.cbInQue )
    return( 0 );

シリアル バッファにはデータがあるため、これは非常に奇妙cbInQueですが、読み取り操作に使用できるデータがゼロに設定されているかどうかがわかります。

このシナリオの回避策はありますか? または、com0com で変更する必要がある設定はありますか?

参考までに、Windows 7 64 ビットでMinGWコンパイラを使用してCode::Blocks IDE を使用しています。

4

1 に答える 1

0

cbInQue() が 0 を返しているので、まだ利用可能なデータがないことを意味します。一部のデータが利用可能になるまで、プログラムをスリープ状態にする必要があります。

このようなもの:

/**

  Check for data waiting to be read

  @return  the number of bytes waiting to be read

*/
int cSerial::ReadDataWaiting( void )
{

    if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );

    DWORD dwErrorFlags;
    COMSTAT ComStat;

    ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );

    return( (int) ComStat.cbInQue );

}
/**

  Blocking wait for an amount of data to be ready

  @param[in] len number of bytes required
  @param[in] msec number of milliseconds to wait

  @return 1 if data ready, 0 if timeout

  */
int cSerial::WaitForData( int len, int msec )
{
    int timeout = 0;
    while( ReadDataWaiting() < len )
    {
        if( timeout++ > msec ) {
            return 0;
        }
        Sleep(1);
    }
    return 1;
}
于 2013-03-05T19:33:58.360 に答える