通讯协议中对于发送的指令中的 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 个解决方案
对于我们这种刚开始接触串口通讯开发的(尤其是自己摸通讯协议),各位高手的一句话 ,顶得上我摸索一整天……
就类似与前几天我的上个问题
http://topic.csdn.net/u/20090409/11/252ce0ff-6cff-4484-bf67-2b67d829b832.html
高手一句话 就茅塞顿开……
@morris88:
哈 又碰上你这热心的家伙了
这个 对C++语法还是不大熟悉 能不能简单描述下……
把49 48 48 49 56 48 52 65 56 48 48 56 70 50 69 50 66 65 48 51 循环累加?
呵呵 我之前一直在做WEB上的ERP系统(C#),对于硬件、网络协议等都不了解
现在是业务需求暂时做某个案子的配套软件
拿到设备基本上从零开始
那么按我现在的需求 计算的逻辑是如何的
协议上说的 ASCII码累加求和(双字节和) 双字节求和 具体是什么 特殊的计算吗?
我把ASCII码 按 48+49+49+48 和 4849+4948 这两种模式 尝试着累加 再去计算 结果对不上
因此……
MD 回复了三次后就不能再用本尊回复 提示短时候回复过多 什么垃圾逻辑判断
一番折腾,总算有些结果了
一开始的思路没错
我把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,关键处如此模糊……
将结果写下来 也让后来同惑者免走弯路……
过后结贴!!!!