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

else { vGu16Bee pTimerCnt-- ; if(0==vGu1 6BeepTime rCnt) { Su8Lock=0; BeepClose( ); } } } }

100%1 / 836
SM0=0;
SM1=1; //SM0 SM1 的设置:选择 10 位异步通信,波特率根据定时器 1 可变
REN=1; //允许串口接收数据
//为了保证串口中断接收的数据不丢失,必须设 IP = 0x10,相当于把串口中断设置为最高优先级,
//这个时候,串口中断可以打断任何其他的中断服务函数实现嵌套,
IP =0x10; //把串口中断设置为最高优先级,必须的
ES=1; //允许串口中断
EA=1; //允许总中断
}
void Delay(unsigned long u32DelayTime)
{
for(;u32DelayTime>0;u32DelayTime--);
}
void PeripheralInitial(void)
{
}
void BeepOpen(void)
{
P3_4=0;
}
void BeepClose(void)
{
P3_4=1;
}
void VoiceScan(void)
{
static unsigned char Su8Lock=0;
if(1==vGu8BeepTimerFlag&&vGu16BeepTimerCnt>0)
{
if(0==Su8Lock)
{
Su8Lock=1;
BeepOpen();
}
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 个字节,作为“起始字节”,起到“接头暗号”的作用,平时用来过滤无关的数据。