我弄不懂串口数据流格式和通信协议的关系了
开发环境是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