当前位置: 首页 > wzjs >正文

长沙推广网站江苏科技大学新校区建设网站

长沙推广网站,江苏科技大学新校区建设网站,百度h5收费吗,wordpress 固定链接 分类收发数据包数据校验 1、和校验异或校验1.1、HEX固定长度数据包校验1.2、HEX不固定长度数据包校验 2、CRC校验 1、和校验异或校验 和校验:将接收到的数据全部相加后,取结果的最后一个字节的数据 异或校验:将接收到的数据全部相异或后&#xff…

收发数据包+数据校验

  • 1、和校验+异或校验
    • 1.1、HEX固定长度数据包校验
    • 1.2、HEX不固定长度数据包校验
  • 2、CRC校验

1、和校验+异或校验

和校验:将接收到的数据全部相加后,取结果的最后一个字节的数据
异或校验:将接收到的数据全部相异或后,取结果的最后一个字节的数据

在线计算和校验/异或校验工具:链接: link

例如:
对 0x33 0x56 0x14 0x32 这4个数据求和校验数据为:0xCF
对 0x33 0x56 0x14 0x32 这4个数据求异或校验数据为:0x43

1.1、HEX固定长度数据包校验

创建工程名为29_UART_Send_Receive_CheckFixedPage

①UART.c文件的代码如下

#include "UART.h"/*** 串口初始化* 参数:波特率*/
void UART_Init(unsigned int Baud)
{/* 串口寄存器的配置 */PCON &= 0x3F;	//PCON = 00xx xxxxSCON &= 0x0F;SCON |= 0x50;	//SCON = 0101 xxxx/* 配置T1的寄存器 */TMOD &= 0x0F;TMOD |= 0x20;	//TOMD = 0010 xxxx:8位自动重装载TH1 = 256 - (28800/Baud);//配置波特率TL1 = 256 - (28800/Baud);//配置波特率ET1 = 0;		//关闭T1溢出中断TR1 = 1;		//使能T1/* 使能串口中断 */ES = 1;			//使能串口中断EA = 1;			//使能中断总开关
}/*** 发送一个字节的数据*/
void Send_Char(unsigned char ch)
{SBUF = ch;	//给SBUF写入一个字节数据while(!TI);	//等待数据发送完成(未完成TI = 0,完成TI = 1)TI = 0;		//手动清0
}/*** 发送多个字节的数据*/
void Send_Array(unsigned char* Array,unsigned char Len)
{unsigned char i;for(i = 0; i<Len; i++){Send_Char(*(Array+i));}
}/*** 发送字符串*/
void Send_String(unsigned char* str)
{while(*str != '\0'){Send_Char(*str++);}
}/*** 对printf函数进行重定向*/
char putchar(char ch)
{Send_Char(ch);return ch;
}/***********中断服务函数*************/
/*** 中断服务函数:接收固定长度为4的HEX数据包,且进行和校验与异或校验* HEX数据包格式:0xFF x x x x 和校验字符 异或校验字符 0xFE*/
unsigned char Buffer[BUFF_Len];		//固定数据包缓存区
unsigned char Index = 0;			//缓存区索引
unsigned char Receive_Flag = 0;		//接收完成标志
void UART_Routine(void) interrupt 4
{	static unsigned char Status = 0;	//状态机变量static unsigned char Sum_Check = 0;	//和校验变量static unsigned char X0r_Check = 0;	//异或校验变量unsigned char ReceiveData;			//暂存数据变量/* 若是发送完成中断:TI = 1*/if(TI){//一般情况下不使用你中断进行发送数据TI = 0;}/* 若接收数据完成中断 RI = 1*/if(RI && !Receive_Flag)				//Receive_Flag = 0表示上一次接收的数据处理完成{RI = 0;ReceiveData = SBUF;switch(Status){case 0:	//判断帧头0xFFif(ReceiveData == 0xFF){Status = 1;//改变状态变量Index = 0;}else{Status = 0;}break;case 1:		//接收数据	Sum_Check += ReceiveData;	//每接收到一个字节的数据就计算出和校验字符X0r_Check ^= ReceiveData;	//每接收到一个字节的数据就计算出异或校验字符Buffer[Index++] = ReceiveData;if(Index >= BUFF_Len)		//接收到4个数据帧{Status = 2;				//改变状态变量}break;case 2:		//进行和校验比对if(Sum_Check == ReceiveData){Status = 3;}else	//进行和校验比对,校验比对失败{Send_Char(0XE0);//返回发送0xE0Status = 0;memset(Buffer,0,4);//清空数据包缓存区}Sum_Check = 0;//和校验变量清零break;case 3:		//进行异或校验比对if(X0r_Check == ReceiveData)//异或校验比对成功{Status = 4;		}else{Send_Char(0XE1);//返回发送0xE1Status = 0;memset(Buffer,0,4);//清空数据包缓存区}X0r_Check = 0;//和校验变量清零break;case 4:	//判断帧尾部if(ReceiveData == 0xFE){Receive_Flag = 1;	//接收完成	}else{memset(Buffer,0,4);//清空数据包缓存区}Status = 0;				//将状态变量置0,便于下次数据包的接收break;default:break;}}
}

②UART.h文件的代码如下

#ifndef __UART_H
#define __UART_H
#include <REGX52.H>	//包含51头文件,里面全是寄存器地址
#include <string.h>
#include <stdio.h>#define BUFF_Len 4	//数据缓存区长度void UART_Init(unsigned int Baud);
void Send_Char(unsigned char ch);//发送一个字节的数据
void Send_Array(unsigned char* Array,unsigned char Len);//发送多个字节的数据
void Send_String(unsigned char* str);//发送字符串
char putchar(char ch);//printf()重定向extern unsigned char Buffer[BUFF_Len];		//固定数据包缓存区
extern unsigned char Receive_Flag;
extern unsigned char Index;#endif

③main.c文件的代码如下

#include "UART.h"void main(void)
{UART_Init(9600);			//9600波特率printf("Code Runing\r\n");while(1){if(Receive_Flag)		//Receive_Flag = 1,数据接收完成{Receive_Flag = 0;Send_Array(Buffer,Index);//将数据发送出去}}
}

在这里插入图片描述

1.2、HEX不固定长度数据包校验

创建工程名为30_UART_Send_Receive_CheckChangePage
①UART.c文件的代码如下

#include "UART.h"/*** 串口初始化* 参数:波特率*/
void UART_Init(unsigned int Baud)
{/* 串口寄存器的配置 */PCON &= 0x3F;	//PCON = 00xx xxxxSCON &= 0x0F;SCON |= 0x50;	//SCON = 0101 xxxx/* 配置T1的寄存器 */TMOD &= 0x0F;TMOD |= 0x20;	//TOMD = 0010 xxxx:8位自动重装载TH1 = 256 - (28800/Baud);//配置波特率TL1 = 256 - (28800/Baud);//配置波特率ET1 = 0;		//关闭T1溢出中断TR1 = 1;		//使能T1/* 使能串口中断 */ES = 1;			//使能串口中断EA = 1;			//使能中断总开关
}/*** 发送一个字节的数据*/
void Send_Char(unsigned char ch)
{SBUF = ch;	//给SBUF写入一个字节数据while(!TI);	//等待数据发送完成(未完成TI = 0,完成TI = 1)TI = 0;		//手动清0
}/*** 发送多个字节的数据*/
void Send_Array(unsigned char* Array,unsigned char Len)
{unsigned char i;for(i = 0; i<Len; i++){Send_Char(*(Array+i));}
}/*** 发送字符串*/
void Send_String(unsigned char* str)
{while(*str != '\0'){Send_Char(*str++);}
}/*** 对printf函数进行重定向*/
char putchar(char ch)
{Send_Char(ch);return ch;
}/***********中断服务函数*************/
/*** 中断服务函数:接收不固定长度的HEX数据包,且进行和校验与异或校验* HEX数据包格式:0xFF x x x x 和校验字符 异或校验字符 0xFE*/
unsigned char Buffer[BUFF_Len];		//固定数据包缓存区
unsigned char Index = 0;			//缓存区索引
unsigned char Receive_Flag = 0;		//接收完成标志
void UART_Routine(void) interrupt 4
{	static unsigned char Status = 0;	//状态机变量static unsigned char Sum_Check = 0;	//和校验变量static unsigned char X0r_Check = 0;	//异或校验变量unsigned char ReceiveData;			//暂存数据变量/* 若是发送完成中断:TI = 1*/if(TI){//一般情况下不使用你中断进行发送数据TI = 0;}/* 若接收数据完成中断 RI = 1*/if(RI && !Receive_Flag){RI = 0;ReceiveData = SBUF;/* 使用状态机对数据包进行处理 */switch(Status)	//Receive_Flag = 0表示上一次接收的数据处理完成{case 0:if(ReceiveData == 0xFF)				//是帧头0xFF{Index = 0;Status = 1;						//改变状态变量}else{Status = 0;						//不是帧头}break;case 1:if(ReceiveData == 0xFE)				//判断是否为帧尾{Sum_Check -= Buffer[Index-1];Sum_Check -= Buffer[Index-2];X0r_Check ^= Buffer[Index-1];X0r_Check ^= Buffer[Index-2];/* 和校验与异或校验比对 */if(Sum_Check == Buffer[Index-2])		//进行和校验比对{if(X0r_Check == Buffer[Index-1])	//进行异或校验比对{Index -= 2;Receive_Flag = 1;				//将标志位置1}else{Send_Char(0xE1);				//返回发送0xE1memset(Buffer,0,BUFF_Len);		//清空数据包缓存区}}else{Send_Char(0xE0);				//返回发送0xE0memset(Buffer,0,BUFF_Len);		//清空数据包缓存区}Sum_Check = 0;						//和校验变量置0X0r_Check = 0;						//异或校验变量置0Status = 0;							//将状态变量置0,便于下次数据包的接收}else//不是帧尾,接收数据{Sum_Check += ReceiveData;		//每接收到一个字节的数据就计算出和校验字符X0r_Check ^= ReceiveData;		//每接收到一个字节的数据就计算出异或校验字符Buffer[Index++] = ReceiveData;	//对数据进行处理}break;default:break;}}
}

②UART.h文件的代码如下

#ifndef __UART_H
#define __UART_H
#include <REGX52.H>	//包含51头文件,里面全是寄存器地址
#include <string.h>
#include <stdio.h>#define BUFF_Len 4	//数据缓存区长度void UART_Init(unsigned int Baud);
void Send_Char(unsigned char ch);//发送一个字节的数据
void Send_Array(unsigned char* Array,unsigned char Len);//发送多个字节的数据
void Send_String(unsigned char* str);//发送字符串
char putchar(char ch);//printf()重定向extern unsigned char Buffer[BUFF_Len];		//固定数据包缓存区
extern unsigned char Receive_Flag;
extern unsigned char Index;#endif

③main.c文件的代码如下

#include "UART.h"void main(void)
{UART_Init(9600);			//9600波特率printf("Code Runing\r\n");while(1){if(Receive_Flag)		//Receive_Flag = 1,数据接收完成{Receive_Flag = 0;Send_Array(Buffer,Index);//将数据发送出去}}
}

在这里插入图片描述

2、CRC校验

在线CRC校验工具:链接: link

http://www.dtcms.com/wzjs/786284.html

相关文章:

  • 苏州有哪些网站制作公司东营招标信息网
  • 网站建设视屏教程做夹具需要知道的几个网站
  • 中国建设教育协会的是假网站吗哈尔滨企业建网站推广
  • php网站接入支付宝做购物商城网站设计
  • 网站制作软件工程师大气好看的网站
  • 东莞出租车公司网站如何优化流程
  • 如何改网站的内容免费招聘网哪个平台比较好
  • 怀来建设局网站平面设计创意广告
  • 网页制作网站首页网络营销课程个人总结3000字
  • 网站上的3d产品展示怎么做石家庄网站建设教程
  • 国外优秀app设计网站有哪些免费在线咨询软件
  • 如何模仿一个网站网站开发优秀论文
  • 网站 设计公司 温州北京做网站费用
  • 网络公司怎么做网站万江网站建设公司
  • 营销型网站有哪些平台洛阳洛龙区网络营销公司
  • 栖霞建设官方网站北京赵公口网站建设
  • asp静态网站源码网站中文域名好吗
  • 做网站卖东西赚钱吗福州做网站公司有哪些
  • 网站建设金手指排名专业表白网址一键生成
  • 学习怎样建网站免费淘宝客网站模板
  • 西安网站设计制作多少钱欧美网站建设教程
  • 郑州做装饰的网站Wordpress不显示功能
  • 做网站哪个服务商便宜网站设计中的js是什么
  • 有做翻页相册的网站吗如何推广小程序
  • 建网站要买服务器吗wordpress播放swf插件
  • 个人网站备案网站名称开奖网站开发
  • 空间手机版网站目录建设京东网站建设策划书
  • 2018做网站开发一个月工资多少网站做编辑赚钱
  • 网站在线留言如何做会计培训机构
  • 贵州省房屋和城市建设厅官方网站北京网站建设方案书