首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从使用com0com构建的虚拟串行端口读取数据时出现问题

从使用com0com构建的虚拟串行端口读取数据时出现问题
EN

Stack Overflow用户
提问于 2012-10-24 23:21:26
回答 1查看 3.1K关注 0票数 0

我正在尝试读取写入使用com0com创建的串行端口的数据。当前配置有两个串口,即COM8和COM9相互连接。

当我使用PuTTY打开这两个串口并在一个终端上写东西时,它立即出现在另一个终端上。然而,当我尝试以编程方式完成时,情况就不同了。

我可以毫无问题地进行写入,但由于某些原因,读取失败。我使用Tom Archer和Rick Leinecker的CSerial library

读取数据的函数如下所示。

代码语言:javascript
复制
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 );
}

当程序在以下行退出时,我无法从串行端口读取数据:

代码语言:javascript
复制
if( !ComStat.cbInQue )
    return( 0 );

这真的很奇怪,因为串行缓冲区有数据,但cbInQue却将可用于读取操作的数据设置为零。

这种情况下有解决方法吗?或者,在com0com中是否有需要更改的设置?

仅供参考,我在Windows7 64位上使用带有MinGW编译器的Code::Blocks集成开发环境。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-06 03:33:58

由于cbInQue()返回零,这意味着还没有可用的数据。你需要让你的程序进入休眠状态,直到一些数据可用。

如下所示:

代码语言:javascript
复制
/**

  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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13052292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档