51单片机UART按通信协议接收一串数据并使用

我弄不懂串口数据流格式和通信协议的关系了

开发环境是keil4

#include "uart.h"
#include "delay.h"

unsigned char recv_buf[MAX_REV_NUM];//数据缓存区,现在是100位
unsigned char recv_flag = 0;
unsigned char recv_cnt;
unsigned char machine_step = 0;

void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速   
	SCON = 0x50;		//8位数据,可变波特率   SM0 SM1 SM2 REN TB8 RB8 TI RI
	TMOD &= 0x0F;		//清除定时器1模式位     0   1   0   1   0   0  0  0 
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ES = 1;      //串口中断
	EA = 1;      //总中断
	TR1 = 1;		//启动定时器1
}
void sendByte(unsigned char dat)
{
SBUF = dat;
	while(!TI);
	TI = 0;
}
void sendString(unsigned char *dat)
{
while(*dat != '\0')
{
sendByte(*dat++);
}
}
char putchar(char c)
{
sendByte(c);
	return c;
}
void clr_recvbuffer(unsigned char *buf)
{
unsigned char i;
	for(i = 0;i<MAX_REV_NUM;i++)
	{
	buf[i] = 0;
	}
}
void uart_ISR() interrupt 4
{
	if(RI)
	{
		RI = 0;
		switch(machine_step)
		{
			case 0:recv_buf[0] = SBUF;
			if(recv_buf[0] == 0x3c)
			{
			machine_step = 1;
			}
			else
			{
				machine_step = 0;
			}
				break;
			case 1:recv_buf[1] = SBUF;
			if(recv_buf[1] == 0x02)
			{
			machine_step = 2;
				recv_cnt = 2;
			}
			else
			{
				machine_step = 0;
			}
			break;
			case 2:recv_buf[recv_cnt] = SBUF;
				recv_cnt++;
			if(recv_cnt > 7)
			{
			machine_step = 3;
			}
			else
			{
			machine_step = 2;
			}
			break;
			case 3:recv_buf[recv_cnt] = SBUF;
			if(recv_buf[recv_cnt] == 0x01)	
			{
			
			}
			break;
		}
		
	}
	if(TI)
	{
	TI = 0;
	}
}

刚学的小白,有没有大佬教教我

你这里不是有协议说明吗?根据协议说明发送和接收数据就可以了,根据校验规则校验数据的准确性。

用头和尾选取出这段数据,按要求对数据进行数据处理,最后校验验证数据的准确性

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y