串口通信中的一个校验和问题(100分)

  • 主题发起人 主题发起人 dfwforce
  • 开始时间 开始时间
D

dfwforce

Unregistered / Unconfirmed
GUEST, unregistred user!
有一份空调机的开发文档,他的通信格式如下:
帧头+有效字节数+地址码+命令属性+命令串+校验和+帧尾
帧头 有效字节数 控制方地址 被控制方地址 命令属性 命令串 校验和 帧尾
F4HF5H 1字节 XXH,XXH XXH,XXH XXH ——— XXH FBH
1、帧头:2字节,固定为F4F5H。
2、有效字节数:1字节,其数值为地址码+命令属性+命令串+校验和的字节总数。
3、地址码:2字节;
4、命令属性:1字节,用来区别不同类型的指令。
5、命令串:指令的工作内容,部分指令(控制指令)可以无命令串。
6、校验和:1字节,有效字节数+地址码+命令属性+命令串的和的低8位,进位忽略(不带进位加,溢出部分忽略)。
7、帧尾:1字节,FBH。
问题:
这个校验和是怎么算的?Delphi里面怎么写?
假如我要发送下面一条命令,校验和是多少呢?
帧头 有效字节数 控制方地址 被控制方地址 命令属性 命令串 校验和 帧尾
F4HF5H 08H 00H,FFH 00H,01H 01H 2字节 XXH FBH
 
问题简化为:
怎么取两个字节相加的结果的低8位?(不带进位加,溢出部分忽略)
有资料说(不带进位加,溢出部分忽略)其本质就是两个操作数进行逻辑异或运算,不知道是否正确?如果正确的话,又怎么取得低8位?
 
sum := 0;
for ...do
sum := (sum+array) mod 256;
 
直接进行与操作就行啊
a := b and $ff
 
就是相关项累加和取256的模。
校验和 = (有效字节数+地址码+命令属性+命令串) mod 256
 
直接用无符号的两个字节相加就行了,不用管溢出不溢出。
 
问题简化为:
怎么取两个字节相加的结果的低8位?(不带进位加,溢出部分忽略)
有资料说(不带进位加,溢出部分忽略)其本质就是两个操作数进行逻辑异或运算,不知道是否正确?如果正确的话,又怎么取得低8位?
不正确,不带进位加是字节间不考虑进位,但位与位之间的进位还是需要考虑的。
你的问题不复杂,就全部加起来再与 0xFF 与 一下就行了。
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
835
DelphiTeacher的专栏
D
D
回复
0
查看
880
DelphiTeacher的专栏
D
D
回复
0
查看
617
DelphiTeacher的专栏
D
后退
顶部