用ReadFile读取数据有时候丢数据
代码如下,请大家看看问题出在哪里,我之前用的pcomm串口控件好像不会丢数据,但是那个没有我想要的波特率,所有自己参考网上的写了个:
static UINT Thread_Read_Pcomm(LPVOID lpParam)
{
CCAN_Parse_V11Dlg *pDlg = (CCAN_Parse_V11Dlg *)lpParam;
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);//创建或打开一个命名的或无名的事件对像
COMSTAT ComStat;
DWORD dwErrorFlags;
//char str[200];
//memset(str,0,200);
DWORD dwBytesRead = 0;//读取的字节数
BOOL bReadStat;
while(1)
{
//memset(Type_uart_buff.rx_buff[Type_uart_buff.rx_index],0,200);
if ((!rx_data_flag)&&(!rx_buff_read))// 数据已读走 && 没有读数据
{
rx_buff_write = TRUE;// 锁
dwBytesRead = 1024;//读取的字节数
ClearCommError(hCom,&dwErrorFlags,&ComStat);
dwBytesRead = min(dwBytesRead, (DWORD)ComStat.cbInQue);
bReadStat = ReadFile(hCom, rx_buff, dwBytesRead, &dwBytesRead, &m_osRead);
if(!bReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
WaitForSingleObject(m_osRead.hEvent,2000);
//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到1秒钟
//当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
}
}
rx_buff_write = FALSE;// 解锁
}
PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
if (dwBytesRead)
{
rx_bytes = dwBytesRead;
dwBytesRead = 0;
rx_data_flag = TRUE;// 有数据 待读出
}
Sleep(1);
}
return 0;//表示函数正常结束
}
[解决办法]
把读操作[static UINT Thread_Read_Pcomm(LPVOID lpParam)]中的
[PurgeComm(hCom, PURGE_TXABORT
[解决办法]
PURGE_RXABORT
[解决办法]
PURGE_TXCLEAR
[解决办法]
PURGE_RXCLEAR);]
去掉试一下