stm32 串口发送一帧数据(异或值数据)

在进行数据传输的时候,发送一帧数据,为了保证其安全性,可以对一帧数据里面的东西进行“加密”

#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;的时候,后面的出来的异或值是不对的

由于在上位机上接收到数据后,也会计算异或值进行校验,然后把两个异或值进行比对,正确了才会做出相对应的指令

由于比对不成功,所以在进行调试的时候发现这个很细节性的问题,就是初始化赋初值的问题!!(此博客只为了告诫自己要多注意细节上的问题,基础知识一定一定要扎实!!)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值