后装机- 判断报文的正确性的分析思想 思想:收到一个报文后,若ReceiveLength大于一个RealLength,就用ReceiveLength减去RealLength,得到MoreLength;首先根据RealLength的值得到该报文中正确的部分并放入RealStrtemp,再根据MoreLength值,取得刚刚收到报文的多余部分并放入LeftTelBuf[],等下一次再接收到报文时,先将该报文加上LeftTelBuf[]而后再做判断。若ReceiveLength小于一个RealLength,根据ReceiveLength值,将刚刚收到的报文放入LeftTelBuf[],等待下一次再接收到报文时,先将该报文加上LeftTelBuf[]而后再做判断。 例:自定义报文:FT001、FT002、FT003、FT004、FT005 ...RealLength = 5 ;MoreLength = 0 ;RealLength = 0 ; 1 )收到Strtemp = ... {”FT001FT0”} ;ReceiveLength = 8 ; -> MoreLength = 8 - 5 = 3 ; -> RealStrtemp = ... {“FT001”} ; -> LeftTelBuf[] = ... {“FT0”} ; 2 )收到Strtemp = ... {”02FT00”} ;Strtemp = LeftTelBuf[] + Strtemp = ... {“FT002FT00”} ; -> ReceiveLength = 9 ; -> MoreLength = 9 - 5 = 4 ; -> RealStrtemp = ... {“FT002”} ; -> LeftTelBuf[] = ... {“FT00”} ; 3 )收到Strtemp = ... {“3FT0”} ;Strtemp = LeftTelBuf[] + Strtemp = ... {“FT003FT0”} ; -> ReceiveLength = 8 ; -> MoreLength = 8 - 5 = 4 ; -> RealStrtemp = ... {“FT003”} ; -> LeftTelBuf[] = ... {“FT0”} ; 4 )收到Strtemp = ... {“0”} ; Strtemp = LeftTelBuf[] + Strtemp = ... {“FT00”} ; -> 由于此时报文的长度小于5,所以还是将其放入到LeftTelBuf中 -> LeftTelBuf = Strtemp = ... {“FT00”} ; -> 继续接收下一个报文 5 )收到Strtemp = ... {“4FT005”} ; Strtemp = LeftTelBuf[] + Strtemp = ... {“FT004FT005”} -> ReceiveLength = 10 -> MoreLength = 10 - 5 = 5 ; -> (假如MoreLength = 5了,正好是一个正确的报文,怎么办 ??? ) -> RealStrtemp = ... {“FT004”} ; -> LeftTelBuf[] = ... {“FT005”} ;…… 程序里是这样写的 int LeftTelNum = 0 ; char LeftTelBuf[ 20 ]; #define ONETELLEN 10; OnOnCommMscomm()函数 if (m_Comm232.GetCommEvent() == 2 ) // 事件值为2表示接收缓冲区内有字符 ... { strtemp=m_Comm232.GetInput().bstrVal; //读接收缓冲区数据 TTel *RcvTel=new TTel;RcvTel->Length=strtemp.GetLength()+LeftTelNum; //取缓冲区报文长度int i;for(i=0;i<LeftTelNum;i++)/**//*第一次LeftTelNum是为0的,所以该循环是不运行的;而当LeftTelNum有值时(意味着收到大于一次的错误报文)*/ RcvTel->Tel[i]=LeftTelBuf[i];/**//*Strtemp是一个空报文,在它里面先写入上一次多出的报文LeftTelBuf []的内容*/for(i=LeftTelNum;i<RcvTel->Length;i++) RcvTel->Tel[i]=strtemp.GetAt(i-LeftTelNum);/**//*在上面Strtemp已经加入过LeftTelBuf []的内容,这里在它后面再加上此次接收到的报文,就是思想里所说的Strtemp=LeftTelBuf[]+Strtemp */DoRecvTel(RcvTel);//将Tel[]送去处理 delete(RcvTel);} DoRecvTel(TTel * BuffTel)函数 while (BuffTel -> Length > 0 ) ... {/**//*当Tel[]<20 并且 Tel[]>=10 时*/if(BuffTel->Length<2*ONETELLEN&&BuffTel->Length>=ONETELLEN) ...{ LeftTelNum=BuffTel->Length-ONETELLEN;/**//*得到多余的长度*/ int i; for(i=0;i<LeftTelNum;i++) LeftTelBuf[i]=BuffTel->Tel[ONETELLEN+i];/**//*根据多余的长度,取得多余的报文,放入LeftTelBuf []中,等待下次接收到报文时使用*/ return; } /**//*当Tel[]<10时*/ if(BuffTel->Length<ONETELLEN) ...{ LeftTelNum=BuffTel->Length; int i; for(i=0;i<LeftTelNum;i++) LeftTelBuf[i]=BuffTel->Tel[i];/**//*将其放入LeftTelBuf ,等待下一次的报文*/ return; }}