急!!!高手帮忙!!VC串口通信的问题,总是清空缓冲区失败!!

huhaoconga 2009-04-14 10:15:12
这事我写的源码:
进入线程后,开始循环获得数据,知道获得到正确的数据,然后处理。
数据开始可以正常接收,但是几分钟后就会出错,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));
}
处理过程.................略
}
...全文
335 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengde007 2009-04-14
  • 打赏
  • 举报
回复
waitForSingleObject(mOsRead.hEvent,2000);
貌似时间太短了.
waitForSingleObject(mOsRead.hEvent,INFINITE);
  • 打赏
  • 举报
回复
http://www.lzh.cn/disp.asp?id=222
参考一下,PurgeComm最好作一步是否为空的判断,是就不必要调用PurgeComm了.
huhaoconga 2009-04-14
  • 打赏
  • 举报
回复
回复一楼hairetz:
那个网页我看了,还是不太明白什么意思?
我的下位机在一直不间断的发数据(12个字节),我上位机的程序 在线程里循环不断的接收并处理数据,所以我让它每次读完数据后不管对不对直接调用PurgeComm()清空缓冲区,可是为什么会在3-5分钟后就出错呢,程序死在了循环里,就是我说的那几个函数,全部不作用了。
而且我关闭线程后,在重新开始线程还是不行!!
huhaoconga 2009-04-14
  • 打赏
  • 举报
回复
等待中...在线等待!各位高手快来帮忙,我是新手!!这个问题折磨我一周多了!
huhaoconga 2009-04-14
  • 打赏
  • 举报
回复
回复一楼hairetz:
您的意思是PurgeComm()这个函数清空一个空缓冲区时除了错误,但是为什么下次的ClearCommError(),ReadFile()都不起作用了呢?

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧