后装机-判断报文的正确性的分析思想

后装机- 判断报文的正确性的分析思想

思想:收到一个报文后,

若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;

         }


}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值