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

huhaoconga 2009-04-10 09:30:17
这事我写的源码:
进入线程后,开始循环获得数据,知道获得到正确的数据,然后处理。
数据开始可以正常接收,但是几分钟后就会出错,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));
}
处理过程.................略
}
...全文
135 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
老邓 2009-04-10
  • 打赏
  • 举报
回复
PurgeComm(dlg->hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); //清空缓冲区
参数对吗?检查一下返回值,再GetLastError()
  • 打赏
  • 举报
回复
GetLastError看下.
aaaa3105563 2009-04-10
  • 打赏
  • 举报
回复
顶··········
sendto66 2009-04-10
  • 打赏
  • 举报
回复
mark
hndth 2009-04-10
  • 打赏
  • 举报
回复
mark
huhaoconga 2009-04-10
  • 打赏
  • 举报
回复
TO: hairetz

怎样设置GetLastError()呢?把它放在代码的什么地方啊?
麻烦您再给点指点 !

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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