[英]Problems with reading data from virtual serial port built with com0com
我正在尝试读取写入com0com创建的串行端口的数据。 当前配置有两个串行端口,即相互连接的COM8和COM9。
当我使用PuTTY打开这两个串行端口并在一个终端中写入内容时,它立即出现在另一终端中。 但是,当我尝试以编程方式进行操作时,情况就不同了。
我可以毫无问题地进行写入,但是由于某些原因读取失败。 我使用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位上使用Code :: Blocks IDE与MinGW编译器。
由于cbInQue()返回零,因此意味着尚无可用数据。 您需要使程序进入休眠状态,直到有可用数据为止。
像这样:
/**
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.