OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2261|回复: 1

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

[复制链接]

5

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2019-3-9
在线时间
11 小时
发表于 2019-4-2 17:15:20 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 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;
        }
}


协议格式

协议格式

最佳答案

查看完整内容[请看2#楼]

已解决,又积累一点经验主要是因为我把时钟搞错了,除了串口1的时钟是72M,其他的时钟都是36M, 还有就是我用串口助手发送16进制的数时候没有点选“以16进制”发送
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

11

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2019-3-9
在线时间
11 小时
 楼主| 发表于 2019-4-2 17:15:21 | 显示全部楼层
本帖最后由 ZLI 于 2019-4-2 17:48 编辑

已解决,又积累一点经验主要是因为我把时钟搞错了,除了串口1的时钟是72M,其他的时钟都是36M,
还有就是我用串口助手发送16进制的数时候没有点选“以16进制”发送
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 14:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表