从单片机基础到程序框架(全集 2019pdf版).pdf - 第770页

第一百三十节: 接收带“动态密匙”与“异或”校验数据 的串口程序框架。 【130.1 “异或”的校验。 】 通信 的校验 常用 有两种 ,一 种是 “累 加和” , 另一种 是“ 异或 ” 。 “ 异或 ”算 法的详 细介 绍请 看前面 章节 的第 32 节。 上一 节讲的 “累 加和 ” ,放 在数据 串的 最后 一个字 节, 是前 面所有 字节 的累加 之和 (不 包括自 己本 身的 字节) , 累加的 结果 高于 一个字 节的 那…

100%1 / 836
else
{
vGu16BeepTimerCnt--;
if(0==vGu16BeepTimerCnt)
{
Su8Lock=0;
BeepClose();
}
}
}
}
第一百三十节: 接收带“动态密匙”与“异或”校验数据的串口程序框架。
【130.1 “异或”的校验。
通信的校验常用有两种,一种是“累加和”另一种是“异或异或”算法的详细介绍请看前面章节
的第 32 节。
上一节讲的“累加和,放在数据串的最后一个字节,是前面所有字节的累加之和(不包括自己本身的
字节)累加的结果高于一个字节的那部分自动溢出丢掉,只保留低 8 位的一个字节的数据。本节讲的“异
或”也是放在数据串的最后一个字节,是前面所有字节的异或结果(不包括自己本身的字节)本节在上一
节的基础上,只更改以下这段校验算法的代码即可。
上一节的“累加和”算法如下:
Gu8ReceZZ=Gu8ReceBuffer[Gu32ReceDataLength-1]; //提取“累加和”
Su8RecZZ=0;
for(i=0;i<(Gu32ReceDataLength-1);i++)
{
Su8RecZZ=Su8RecZZ+Gu8ReceBuffer[i]; //计算“累加和”
}
if(Su8RecZZ==Gu8ReceZZ) //验证“累加和”计算的”与“接收的”是否一致
{
//此处省去若干代码
}
本节的“异或”算法如下:
Gu8ReceZZ=Gu8ReceBuffer[Gu32ReceDataLength-1]; //提取接收到的“异或
Su8RecZZ=Gu8ReceBuffer[0]; //提取数据串第“i=0”个数据作为异或的原始数据
for(i=1;i<(Gu32ReceDataLength-1);i++) //注意,这里是从第“i=1”个数据开始
{
Su8RecZZ=Su8RecZZ^Gu8ReceBuffer[i]; //计算“异或”
}
if(Su8RecZZ==Gu8ReceZZ) //验证“异或”“计算的”与“接收的”是否一致
{
//此处省去若干代码
}
【130.2 通信协议。
数据头(EB):占 1 个字节,作为“起始字节”,起到“接头暗号”的作用,平时用来过滤无关的数据。
数据类型(01):占用 1 个字节。数据类型是用来定义这串数据的用途。
数据长度(00 00 00 0B):占 4 个字节。用来告诉通信的对方,这串数据一共有多少个字节。
其它数据(03 E8):此数据根据不同的“数据类型”可以用来做不同的用途,根据具体的项目而定。
动态密匙(00 01):这两个字节代表一个 unsigned int 类型的数据,数据范围是 0 65535,但是考
虑到数据更加安全可靠,一般丢弃了首尾的 0(十六进制 00 00) 65535(十六进制的 FF FF)只保
1 65534 的变化。大部分的通信模型都是主机对从机“一问一应答”模式,也就是,主机每发送一条
指令给从机,从机才返回一条消息作为应答。如果主机发送了信息后,在规定的时间内,没有收到从机的应
答指令,主机就继续发送信息给从机,但是此时,从机本来应该应答主机当前指令的可能因为某种情况导
致反馈的信息发生了延时,导致此时应答的数据是主机的上一条指令,从而造成“一问一应答”的数据帧发
送了错位,这种情况加上“动态密匙就能使问题得到有效的解决。主机每发送一条信息,信息里都携带了
2 个字节的“动态密匙”从机每收到主机的一条信息在应答此信息时都把收到的“动态密匙”原封不动的
反馈给主机,主机再查看发送的“动态密匙”与接收到的“动态密匙”是否一致,以此来判断应答数据是否
有效。“动态密匙”像流水号一样,每发送一次指令后都累加 1,不断发生变化, 1 65534,依次循环
这是数据校验的一种方式
异或(0B)“异或”放在数据串的最后一个字节是前面所有字节的异或结果(不包括自己本身的字节)
比如:本例子中,数据串是:EB 01 00 00 00 0B 03 E8 00 01 0B。其中最后一个字节 0B 就是“异或”字
节,前面所有字节相“异或等于十六进制的 0B。验证“异或”的方法,可以借用电脑“附件”自带的“计
算器”软件来实现,打开“计算器”软件后,在“查看”的下拉菜单里,选择“程序员”,然后选择“十六
进制”该计算器软件的异或运算按键是“Xor。不管是主机还是从机,每接收到一串数据后,都要自己
算一次“异或”把自己计算得到的“异或”与接收到的最后一个字节“异或”进行对比,来判断接收到
的数据是否发生了丢失或者错误。
【130.3 程序例程。
上图 130.3.1 有源蜂鸣器电路