串口读的怎么实现编程环境是Visual C++ 2005, 程序中打开PC机的串口,往串口写数据我已经基本解决了。现在是怎么从串口读数据的问题。从论坛上找到的这段代码,包括这个两个函数,如下所示。
请问这个ReadData( void *buffer, int limit )函数怎么用,是放在一个循环里面不停地查询吗? 另外这个ReadDataWaiting( void )函数怎么用?
谢谢!//////////////////////////////////////////////////////////////
int CSerialYB::ReadDataWaiting( void )
{ if( !m_bOpened || m_hIDComDev == NULL ) return( 0 ); DWORD dwErrorFlags;
COMSTAT ComStat; ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat ); return( (int)ComStat.cbInQue );
} /////////////////////////////////////////////////////////////////////////
int CSerialYB::ReadData( void *buffer,
int limit )
{
if( !m_bOpened || m_hIDComDev == NULL )
return( 0 ); BOOL bReadStatus;
DWORD dwBytesRead, dwErrorFlags;
COMSTAT ComStat; 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 );
return( (int)dwBytesRead );
}
return( 0 );
} return( (int) dwBytesRead );
}
请问这个ReadData( void *buffer, int limit )函数怎么用,是放在一个循环里面不停地查询吗? 另外这个ReadDataWaiting( void )函数怎么用?
谢谢!//////////////////////////////////////////////////////////////
int CSerialYB::ReadDataWaiting( void )
{ if( !m_bOpened || m_hIDComDev == NULL ) return( 0 ); DWORD dwErrorFlags;
COMSTAT ComStat; ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat ); return( (int)ComStat.cbInQue );
} /////////////////////////////////////////////////////////////////////////
int CSerialYB::ReadData( void *buffer,
int limit )
{
if( !m_bOpened || m_hIDComDev == NULL )
return( 0 ); BOOL bReadStatus;
DWORD dwBytesRead, dwErrorFlags;
COMSTAT ComStat; 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 );
return( (int)dwBytesRead );
}
return( 0 );
} return( (int) dwBytesRead );
}
char rdMessage [100];
if (Serial.ReadDataWaiting())
{
Serial.ReadData(rdMessage,100);
.........
.........
}
具体到当串口上有数据时,我记得好像可以通过通知的方式告知程序,就像socket一样。
DWORD CCom::ThreadProc()
{
if(!::SetCommMask(m_hCom, m_dwMaskEvent))
{
::MessageBox(m_hNotifyWnd, " SetCommMask failed", "", 0);
return -1;
}
DWORD dwError, dwMask, dwTrans;
COMSTAT Stat;
while(!m_bExit)
{
dwMask = 0;
if(!::WaitCommEvent(m_hCom, &dwMask, &m_WaitOl))
{
if(::GetLastError() == ERROR_IO_PENDING)
{
::GetOverlappedResult(m_hCom, &m_WaitOl, &dwTrans, TRUE);
}
else
continue;
}
switch(dwMask)
{
case EV_RXCHAR:
{
// 有数据进来,获取数据大小
::ClearCommError(m_hCom, &dwError, &Stat);
if(Stat.cbInQue >= m_dwNotifyNum)
{
OnReceive();
}
}
break;
case EV_TXEMPTY: // 输出缓冲区中的最后一个字符被发送了
OnTXEmpty();
break;
case EV_CTS: // clear-to-send信号改变
OnCTS();
break;
case EV_DSR: // data-set-ready信号改变
OnDSR();
break;
case EV_RING:
OnRing();
break;
case EV_RLSD:
OnRLSD();
break;
case EV_BREAK:
OnBreak();
break;
case EV_ERR:
OnError();
break;
default:
continue;
}
}
return 0;
}