在进行数据传输的时候,发送一帧数据,为了保证其安全性,可以对一帧数据里面的东西进行“加密”
#include <stdio.h>
typedef struct My_Test
{
int head; //帧头
int length;
int type;
int command;
int work;
int fre;
int chan;
int check; //校验(异或值)
int end; //帧尾
};
void main()
{
struct My_Test one_test;
unsigned char test_rx[]="zzzzzzz";
int mycheck=0;
int i=0;
one_test.head = 0xAA;
one_test.length = 0x01;
one_test.type = 0x02;
one_test.command = 0x03;
one_test.work = 0x04;
one_test.fre = 0x05;
one_test.chan = 0x06;
//从帧头后到异或值前的6位进行异或
//把数据存在数组里面
test_rx[0] = one_test.length;
test_rx[1] = one_test.type;
test_rx[2] = one_test.command;
test_rx[3] = one_test.work;
test_rx[4] = one_test.fre;
test_rx[5] = one_test.chan;
//对数组里的数据挨个进行异或
for(i=0;i<6;i++)
{
mycheck ^= test_rx[i];
}
//得出一帧数据的异或值
one_test.check = mycheck;
one_test.end = 0xBB;
//打印完整的一帧数据
printf("%x-%x-%x-%x-%x-%x-%x-%x-%x\r\n",one_test.head,one_test.length,\
one_test.type,one_test.command,one_test.work,one_test.fre,\
one_test.chan,one_test.check,one_test.end);
//打印结果: aa-1-2-3-4-5-6-7-bb
//异或值为 0x07
}
其中需要注意的点就是定义变量的时候记得赋初值,在实际使用中,我的程序上写的是 int mycheck;
在有些编译器上是不会有什么问题,但当我使用在单片机上,直接static unsigned char mycheck;的时候,后面的出来的异或值是不对的
由于在上位机上接收到数据后,也会计算异或值进行校验,然后把两个异或值进行比对,正确了才会做出相对应的指令
由于比对不成功,所以在进行调试的时候发现这个很细节性的问题,就是初始化赋初值的问题!!(此博客只为了告诫自己要多注意细节上的问题,基础知识一定一定要扎实!!)