首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

这是小弟我写的一段组包的源码,请大家看看

2012-03-22 
这是我写的一段组包的源码,请大家看看?//组装串口发过来的报文格式char*SSjxlh136161203810381 //15位

这是我写的一段组包的源码,请大家看看?
//组装串口发过来的报文格式
        char   *SSjxlh   =   "136161203810381 ";     //15位的手机序列号

        char   Data[10];
        char   DStr[20];
        char   DStrS[22];

        int   I;
        for(I=0;I <8&&SSjxlh[I*2];I++)
        {
              if(SSjxlh[I*2+1])
              {
                    Data[I]   =   SSjxlh[I*2]*10+SSjxlh[I*2+1];
              }
              else
              {
                        Data[I]   =   SSjxlh[I*2];
                        I++;break;
              }
        }               //转换成8位BCD码


        Data[I]   =   0;
        Data[I+1]   =   3;               //在8位BCD码后加入“03”交易码

        //对Data(共10位)进行加密
        x_StrCryptUN(Data,10, "99 ");       // "99 "为密钥,加密成10位

        BinToHex(Data,DStr,I+2);     //把Data由二进制转换成16进制,长度扩展为一倍,即20位

        DStrS[0]= '9 ';
        DStrS[1]= '9 ';
        strcpy(DStrS+2,DStr);     //在DStr前加上 "99 "两位密钥,组合成22位的固定报文

        char   *Sjy= "policeNum=32051234&searchDate=20060526& ";   //http格式的报文-警员号+查询日期
        int   rlen;
        rlen=strlen(Sjy);
        AnsiString   SBwmx= " ";
        x_StrCryptUN(Sjy,rlen, "3204010123456789 ");     //利用“3204010123456789”16位通讯密钥进行加密,长度不变
        for   (int   j=0;j <rlen;j++)
        {
            SBwmx=SBwmx+IntToHex(Sjy[j],2);     //转换成16进制,长度扩展为1倍
        }

        //把两串报文组合在一起
        AnsiString   SBwall;
        SBwall=AnsiString(DStrS)+SBwmx;

        //把该串报文组合成串口报文
        //通讯序号设为 "0 "
        //数据长度=通讯序号的长度(1)+报文的长度(求SBwall的长度)
        int   datalen;
        AnsiString   dataxh= "1 ";
        datalen=SBwall.Length()+1;     //求得数据长度(最大3位)

        //对数据长度、通讯序号、报文数据进行组装,并进行校验运算
        AnsiString   DataMx;
        DataMx=AnsiString(datalen)+dataxh+SBwall;

        //校验   (对数据长度、通讯序号、报文数据的校验,也即对DataMx的校验)
        unsigned   char   *CDataMx;
        CDataMx=DataMx.c_str();     //把AnsiString类型字符串转换为char字符串


        int   CDataMxLen;
        CDataMxLen=strlen(CDataMx);
        unsigned   char   ch;
        ch=0;
        int   k;
        for   (k=0;k <CDataMxLen;k++)
            ch=ch^CDataMx[k];         //计算校验位,1位
        CDataMx[k]=ch;         //加上校验位后的char字符串

        //校验成功后合并串口报文,前面加0x02,后面加0x03
        char   *CDataMxZ=new   char[1024];
        CDataMxZ[0]= '0x02 ';
        strcpy((char   *)&CDataMxZ[1],CDataMx);
        int   CLen;
        CLen=strlen(CDataMxZ);
        CDataMxZ[CLen]= '0x03 ';


      //1.对报文CDataMxz的头、尾进行解析,如发现头为0x02,尾为0x03则正确
      int   len;
      len=strlen(ReccMx);
      待做中.....

[解决办法]
什么问题?

热点排行