关于发送指令时的 CHECKSUM ,帮忙解析下通讯协议。将结果模65536后取补运算?


通讯协议中对于发送的指令中的 SUM (CHECKSUM) 段的规定如下:

SUM (CHECKSUM), 数据桢的校验码:CHECKSUM 的计算是:整个数据桢中除SOI , EOI和SUM本身之外的其他字符,按发送的ASCII码累加求和(双字节和),将结果模65536后取补运算(余数取反加1)。高位在前,低位在后。

那么在如下指令 (已将SOI , EOI删除掉的)

10 01 80 4A 80 08 F2 E2 BA 03
HEX:
31 30 30 31 38 30 34 41 38 30 30 38 46 32 45 32 42 41 30 33
ASCII:
49 48 48 49 56 48 52 65 56 48 48 56 70 50 69 50 66 65 48 51

根据监听串口 得到程序发送的CHECKSUM是:FB BC 

那么这里的的FB BC 到底是怎么计算的呢 我把ASCII累加的结果 也就是 49+48+48+49... 得到的结果是 1092 模65536再取反 也是-1093 和 FB BC (64444)对不上……
初次接触串口通讯 还请帮忙解惑

10 个解决方案

#1


对于我们这种刚开始接触串口通讯开发的(尤其是自己摸通讯协议),各位高手的一句话 ,顶得上我摸索一整天……
就类似与前几天我的上个问题
http://topic.csdn.net/u/20090409/11/252ce0ff-6cff-4484-bf67-2b67d829b832.html

高手一句话 就茅塞顿开……

#2


unsigned short ChkSum(unsigned short *pData,int iDataLen) 

  unsigned long iSum; 
  unsigned short iOldByte=0; 
  unsigned short *w=pData; 
  int len = iDataLen; 

  iSum=0; 
  
  while(len>1) 
    { 
      iSum +=*w++; 
      len-=2; 
    } 
  
  if(len==1) 
    { 
      *(u_char*)(&iOldByte)=*(u_char*)w; 
      iSum+=iOldByte; 
    } 
  iSum=(iSum>>16)+(iSum&0xffff); 
  iSum+=(iSum>>16); 
  iOldByte=~iSum; 

  return(iOldByte); 

#3


#4


@morris88:
哈 又碰上你这热心的家伙了  
这个 对C++语法还是不大熟悉  能不能简单描述下……

把49 48 48 49 56 48 52 65 56 48 48 56 70 50 69 50 66 65 48 51 循环累加?

#5


这个就是 tcp/ip 协议栈用来计算 ip 校验和的一个实现,ip 校验和就是一个累加和...

#6


呵呵  我之前一直在做WEB上的ERP系统(C#),对于硬件、网络协议等都不了解 
现在是业务需求暂时做某个案子的配套软件
拿到设备基本上从零开始

那么按我现在的需求 计算的逻辑是如何的  

协议上说的 ASCII码累加求和(双字节和)  双字节求和 具体是什么 特殊的计算吗?

我把ASCII码 按 48+49+49+48  和 4849+4948 这两种模式 尝试着累加 再去计算 结果对不上

因此……

#7


还是需要帮助啊 具体的算法是如何呢
c++看不懂……


#8


try again

#9


MD  回复了三次后就不能再用本尊回复  提示短时候回复过多 什么垃圾逻辑判断

#10


一番折腾,总算有些结果了
一开始的思路没错
 我把ASCII累加的结果 也就是 49+48+48+49... 得到的结果是 1092 模65536再取反 也是-1093 和 FB BC (64444)对不上…… 

关键在于协议中这句话:将结果模65536后取补运算(余数取反加1)。

MD,这里所谓的取补根本不是直接~1092=-1093

而是把1092转成二进制 
1092的二进制为10001000100 高位补零 0000010001000100 
按位取反得到 1111101110111011 结果是 64443 再TMD加1  就是64444了

写这个协议的家伙应该被XXOO,关键处如此模糊……

将结果写下来 也让后来同惑者免走弯路……

过后结贴!!!!
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告