/*Tele_TaskRx() 从USART环形缓冲区读出一帧数据存入BUF,解析BUF
BUF[0] = 0xEB;
BUF[1] = 0x90;
BUF[3] 控制命令
BUF[35] 和校验
*/
void Tele_TaskRx()
{
unsigned char check,Buf[36],idx;
int i;
while(((UartBuf[ComTele].head-UartBuf[ComTele].tail)+256)%256 >=36) //USART中断接收缓冲区是一个环形缓冲区,tail为上次帧读完后
//新帧的第一个字节,head为新帧的最后一个字节
//UartBuf[ComTele].head-UartBuf[ComTele].tail)+256)%256 为新帧有多少数据
{
if(UartBuf[ComTele].buf[UartBuf[ComTele].tail]==0xEB&&UartBuf[ComTele].buf[UartBuf[ComTele].tail+1]==0x90) //帧开头为0XEB 0X90
//如果不为0XEB 0X90 则tail加1,直到找到0XEB 0X90
{
check=0x00; //和校验初始化
for(i=0;i<36;i++) //一帧所有数据累加
check += UartBuf[ComTele].buf[(UartBuf[ComTele].tail+i)%256];
if(check==0x00) //和校验为0则数据正确,如果不为0,tail加1,直到找到下一帧头0XEB 0X90
{
hand=4;
for(idx=0;idx<36;idx++) //把这一帧数据存入BUF
{
Buf[idx]=UartBuf[ComTele].buf[UartBuf[ComTele].tail];
UartBuf[ComTele].tail = (UartBuf[ComTele].tail+1)%256;
}
switch(Buf[3]) //BUF[3]为控制帧,根据帧内容不同,进行不同控制
{
case 'C':
TeleFrameC(Buf);
break;
case 'W':
TeleFrameW(Buf);
break;
case 'L':
TeleFrameL(Buf);
break;
default:
break;
}
}
else
UartBuf[ComTele].tail = (UartBuf[ComTele].tail+1)%256;
}
else
UartBuf[ComTele].tail = (UartBuf[ComTele].tail+1)%256;
}
DelayTask(10);
}
USART代码分析
最新推荐文章于 2023-07-05 18:18:49 发布
本文深入探讨USART(通用同步/异步收发传输器)通信协议,讲解其工作原理,并结合具体代码进行详细分析,帮助读者理解如何在嵌入式系统中实现USART通信。内容涵盖USART初始化设置、数据传输流程、中断处理以及常见问题解决策略。
摘要由CSDN通过智能技术生成