USART代码分析

本文深入探讨USART(通用同步/异步收发传输器)通信协议,讲解其工作原理,并结合具体代码进行详细分析,帮助读者理解如何在嵌入式系统中实现USART通信。内容涵盖USART初始化设置、数据传输流程、中断处理以及常见问题解决策略。
摘要由CSDN通过智能技术生成
/*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);    
}  


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值