急!!!高手帮忙!!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));
}
处理过程.................略
}
进入线程后,开始循环获得数据,知道获得到正确的数据,然后处理。
数据开始可以正常接收,但是几分钟后就会出错,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));
}
处理过程.................略
}
...全文
相关推荐
VC6下用控件进行串口通信
VC6下基于MFC的程序,用控件进行串口通信
VC6开发串口调试助手ComTest:从串口通信原理到实战
串口通信是嵌入式开发、硬件调试与上位机联调中的基础技术,其本质是设备间通过串行数据线按位传输,必须严格约定波特率、数据位、停止位与校验位。理解这一原理,才能正确实现数据的收发与解析。在Windows平台上,开发者常借助MSComm控件快速构建串口调试工具,通过事件驱动模型处理异步数据,并结合二进制模式避免0x00被截断等隐藏问题。这类工具广泛应用于单片机、GPS模块、PLC等设备的通信验证,可大幅提升调试效率。本文以VC6开发串口调试助手ComTest为例,讲解如何借助MSComm控件完成串口参数配置、数据
VC6.0环境下GPS数据采集程序设计:串口通信与NMEA协议解析实战
串口通信是嵌入式与工业控制领域的基础技能,其核心在于通过物理链路实现设备间的数据交换。在Windows平台下,基于API的串口编程需要掌握CreateFile、ReadFile等系统调用,并配合多线程技术确保数据接收的实时性与稳定性。GPS数据采集作为典型应用场景,依赖NMEA-0183协议标准,该协议以文本帧格式输出经纬度、速度、时间等定位信息,解析过程中需完成帧同步、校验和验证及度分格式转换。理解这些底层原理,不仅有助于解决老系统维护中的实际问题,也能为理解现代物联网数据采集框架提供扎实基础。本文从串口
VC 串口通信程序打开串口
VC 串口通信程序 串口通信,打开串口,发送信息,接收信息.
VC 编写的串口通信源程序
这是我用VC编写的串口通信程序,对大家的学习,肯定帮助很大,所以,想一睹为快的话,先花点积分。


