使用F103串口3接收指令,配置都没有问题,自己写了一个协议·,但是接收不到,请大神帮我看看

2019-07-21 03:36发布

本帖最后由 ZLI 于 2019-4-2 17:20 编辑


//////////////////////////////////////////////////////////////////
//******************************************************************
//串口3接收函数
//****************************************************************
#if EN_USART3_RX   //如果使能了接收        
u8 USART3_RX_BUF[USART3_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
u16 USART3_RX_STA=0;       //接收状态标记         
void USART3_IRQHandler(void)
{        
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();   
#endif        
        if(USART3->SR&(1<<5))        //接收到数据
        {         
        Uart3_Rec(USART3->DR);               
        }
#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntExit();                                                                                          
#endif
}
#endif        
//**********************************************
//初始化IO 串口3
//pclk2CLK2时钟频率(Mhz)
//bound:波特率
//***********************************************
void uart3_init(u32 pclk2,u32 bound)
{           
        float temp;
        u16 mantissa;
        u16 fraction;           
        temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
        mantissa=temp;                                 //得到整数部分
        fraction=(temp-mantissa)*16; //得到小数部分         
    mantissa<<=4;
        mantissa+=fraction;
        RCC->APB2ENR|=1<<3;   //使能PORTB口时钟  PB10,11
        RCC->APB1ENR|=1<<18;  //使能串口3时钟
        GPIOB->CRH&=0XFFFF00FF;//IO状态设置
        GPIOB->CRH|=0X00008B00;//IO状态设置
        RCC->APB1RSTR|=1<<18;   //复位串口3
        RCC->APB1RSTR&=~(1<<18);//停止复位                     
        //波特率设置
         USART3->BRR=mantissa; // 波特率设置         
        USART3->CR1|=0X200C;  //1位停止,无校验位.
#if EN_USART3_RX                  //如果使能了接收
        //使能接收中断
        USART3->CR1|=1<<5;    //接收缓冲区非空中断使能                    
        MY_NVIC_Init(3,3,USART3_IRQn,2);//组2,最低优先级
#endif
}


//***************************************
//
#include"protocol.h"
#include "uart3.h"        
u8 Rx3_flag1 = 0;
u8 Cmd,Range;
u8 Cmd_R,Cmd_L,Range_R,Range_L;
u8 Rx3_rec[6] ={0};
void Uart3_Rec(u8 rec)
{
        if((Rx3_flag1 == 0)&&(rec == 0xCD))
        {
                Rx3_rec[Rx3_flag1] = rec;
            Rx3_flag1 ++;
        }        
        else if(Rx3_flag1 == 1&&rec == 0xEB )
        {
                Rx3_rec[Rx3_flag1] = rec;
                Rx3_flag1 ++;
        }        
        else if(Rx3_flag1 == 2&&rec == 0xD7 )
        {
            Rx3_rec[Rx3_flag1] = rec;
                Rx3_flag1 ++;
        }        
        else if(Rx3_flag1 == 3&&rec == 0x02 )
        {
           Rx3_rec[Rx3_flag1] = rec;
           Rx3_flag1 ++;
        }        
        else if(Rx3_flag1 >= 4 && Rx3_flag1 < 6)
        {
                Rx3_rec[Rx3_flag1] = rec;
            Rx3_flag1 ++;
        }
        else
        {
            Rx3_flag1 =0;
        }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。