串口错误以后不能继续接收(200分)

  • 主题发起人 duanliandl
  • 开始时间
D

duanliandl

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,我在做串口通讯程序的时候,程序在连续运行几天以后,就会出现不能接收
数据的现象,跟踪发现停止在if (WaitCommEvent(Port, &dwEvtMask, NULL)) ,不能往下
执行,用超级终端连接也没有收到数据,重启又恢复正常,
出错后按照大富翁的文章增加 ClearCommError(Port,&dwEvtMask,&ComStat) 没有作用
或者 增加在检测出错以后,设置 SetCommMask(hPort[portNum], 0) 可以跳出WaitCommEvent
但是还不能正常接收,各位帮帮忙啊!
是不是一定要重启才能解决,我用win98做接收机,程序用c++builder5
下面是我接收的程序段:
bool __fastcall TComm2::Receive()
{ //串口收到数据存入CommBuffer[j]
DWORD errcode;
Boolean successflag;
DWORD dwEvtMask;
unsigned long nBytesRead;
int i,j,k,m,o;
unsigned char RecC[2300];
successflag=PurgeComm(Port,PURGE_RXCLEAR);//Clears the input buffer
if (! successflag)
{ //
}
ReHead[0][0]=0xeb; //同步字: EB90EB90EB9071
ReHead[0][1]=0x90;
ReHead[0][2]=0xeb;
ReHead[0][3]=0x90;
ReHead[0][4]=0xeb;
ReHead[0][5]=0x90;
ReHead[0][6]=0x71; //E=0,L=1,S=1,D=1 ,0001 : 控制字
COMSTAT ComStat; //串口状态
successflag=ClearCommError(Port,&dwEvtMask,&ComStat); //更新串口状态结构并清除所有串口硬件错误
if (WaitCommEvent(Port, &dwEvtMask, NULL)) //等待串行口事件
{
if(dwEvtMask&EV_RXCHAR)//A character was received and placed in the input buffer
{
ReadFile(Port,RecC,2048, &nBytesRead,NULL);//处理接收数据,RecC读入内容,nBytesRead位数
for(i=0;i<2048;i++)
CommBuffer[1]=0; // 清零
for(i=0;i<nBytesRead;i++)
{ if((RecC==ReHead[0][0])&amp;&amp;(RecC[i+1]==ReHead[0][1])&amp;&amp;
(RecC[i+2]==ReHead[0][2])&amp;&amp;(RecC[i+3]==ReHead[0][3])&amp;&amp;
(RecC[i+4]==ReHead[0][4])&amp;&amp;(RecC[i+5]==ReHead[0][5])&amp;&amp;
(RecC[i+6]==ReHead[0][6]))
{
for(o=0;o<nBytesRead-i;o++)//i 当前帧开始位
CommBuffer[1][o]=RecC[i+o];
// CloseHandle(Port);
return true;
} //end of if RecC
} //end of for(i=0;i<nBytesRead;i++)
return false;
} //if(dwEvtMask&amp;EV_RXCHAR)
errcode = GetLastError();
DispReport->Lines->Add(" 收到一个字符并且放入缓冲区 出错!<dwEvtMask&amp;EV_RXCHAR> errcode="+IntToStr(errcode)+",/n 检测串口时间:"+DateTimeToStr(Now()));
CloseHandle(Port);
return false;
} //if WaitCommEvent
errcode = GetLastError();
DispReport->Lines->Add(" 等待串行口事件出错!<WaitCommEvent> errcode="+IntToStr(errcode)+",/n 检测串口时间:"+DateTimeToStr(Now()));
CloseHandle(Port);
return false;
}
救命啊。。。。
 
为什么要放在这么大一个循环里? 事件驱动不好吗?
 
你用的是什么设备?是多串口一类的东西吗?如果是,有可能是设备的问题,我以前也碰到
过类似的问题,好像只能重启
 
我只是用COM1口来接收数据而已。
测试时,两台机器通过一根串口线相连,一台机器通过程序模拟数据发送,另外一台机器
接收,但是只能正常运行两天就出问题了。
 
把串口关开一次就可
 
接收机一般不能关的吧,事件驱动?是什么意思啊。

关注。
 
顶部