急!!!高手帮忙!!VC串口通信的问题,总是清空缓冲区失败!!
这事我写的源码:
进入线程后,开始循环获得数据,知道获得到正确的数据,然后处理。
数据开始可以正常接收,但是几分钟后就会出错,ClearCommError(),ReadFile(),PurgeComm()这几个函数全部出错,不再正常工作。
为什么啊??
急求答案!!
UINT MyThread( LPVOID pParam )
{
CCGuangDianDlg *dlg=(CCGuangDianDlg*) pParam;
while(dlg->bThread)
{
//执行线程内部操作
char str[13]={0};
for(int j=0;j<12;j++)
dlg->m_byte[j]=0;
COMSTAT comstat;
BYTE a=0,b=0;
do //开始读取内容,以0xff 0xef 开始, 0xff 0xff结束,中间有效数据8个字节
{
a=0; b=0;
for(int j=0;j<13;j++)
str[j]='\0';
//COMSTAT comstat;
OVERLAPPED mOsRead; //I/O读取操作变量
memset(&mOsRead,0,sizeof(OVERLAPPED));
mOsRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); //设定事件对象
DWORD dwBytesRead=12; //设定要读取的字节数
DWORD dwRealRead=0;
DWORD dwErrorFlags=0;
BOOL bRead=0;
BOOL bClear=0;
(DWORD)comstat.cbInQue=0;
bClear=::ClearCommError(dlg->hCom,&dwErrorFlags,&comstat);
//DWORD testError;
//testError=dwErrorFlags;
bClear=0;
dwBytesRead=min(dwBytesRead, (DWORD)comstat.cbInQue);
bRead=::ReadFile(dlg->hCom,str,dwBytesRead,&dwRealRead,&mOsRead);//读取数据str
////////////////
a=(BYTE)str[0] & 0xff;
b=(BYTE)str[1] & 0xff;
////////////////
if(!bRead)
{
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作
{
WaitForSingleObject(mOsRead.hEvent,2000);
//使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟
//当串口读操作进行完毕后,m_osRead的hEvent事件会变为有信号
bClear=PurgeComm(dlg->hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); //清空缓冲区
}
}
bClear=::PurgeComm(dlg->hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); //清空缓冲区
if(bClear==0)
{
a=0;
b=0;
::AfxMessageBox("清空缓冲区失败!");
bClear=PurgeComm(dlg->hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return 0;
}
}while(!(a==0xff && b==0xef));
}
处理过程.................略
}