OpenEdv-开源电子网

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

我想知道为啥串口每次都会把default的语句执行一遍

[复制链接]

1

主题

1

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2019-10-7
在线时间
4 小时
发表于 2019-10-7 17:23:06 | 显示全部楼层 |阅读模式
1金钱
#include "sys.h"
#include "delay.h"
#include "usart.h"

UART_HandleTypeDef USART1_Handler;    //定义句柄
int n=3;
unsigned char RE[1];
unsigned char buff[]="Hello World! 世界你好!";
unsigned char A1[]="yes";
unsigned char A2[]="no";

void USART1_Init( )
{
        USART1_Handler.Instance=USART1;
        USART1_Handler.Init.BaudRate=115200;//设置波特率
        USART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //设置字长
        USART1_Handler.Init.StopBits=UART_STOPBITS_1;      //设置停止位 1位
        USART1_Handler.Init.HwFlowCtl=UART_PARITY_NONE;    //不开启硬件流控制
        USART1_Handler.Init.Mode=UART_MODE_TX_RX;          //同时开启接收和发送
        USART1_Handler.Init.Parity=UART_PARITY_NONE;       //不使用奇偶校验位
       
        HAL_UART_Init(&USART1_Handler);
}

void HAL_UART_MspInit(UART_HandleTypeDef *huart)       //回调函数
{
        GPIO_InitTypeDef GPIO_Initure;
       
        if(huart->Instance==USART1)
        {
                __HAL_RCC_GPIOA_CLK_ENABLE();                        //使能GPIOA时钟
                __HAL_RCC_USART1_CLK_ENABLE();                        //使能USART1时钟

                GPIO_Initure.Pin=GPIO_PIN_9;                        //PA9
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
                GPIO_Initure.Pull=GPIO_PULLUP;                        //上拉
                GPIO_Initure.Speed=GPIO_SPEED_FAST;                //高速
                GPIO_Initure.Alternate=GPIO_AF7_USART1;        //复用为USART1
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PA9

                GPIO_Initure.Pin=GPIO_PIN_10;                        //PA10
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PA10       

                HAL_NVIC_EnableIRQ(USART1_IRQn);                                //使能USART1中断通道
                HAL_NVIC_SetPriority(USART1_IRQn,3,3);                        //抢占优先级3,子优先级3 可写0-3
        }
}

void USART1_IRQHandler(void)       //中断服务函数
{
/*    每接收到一个数据都进入一次中断,并进入中断服务函数   */
        HAL_UART_IRQHandler(&USART1_Handler);        //调用HAL库中断处理公用函数       
        HAL_UART_Receive_IT(&USART1_Handler,RE, sizeof(RE)); //开启接收中断

}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)/*  接收回调函数,一组数据全部接收完了才进来一次   */
{
        unsigned char m;
        if(huart->Instance==USART1)  //判断是不是串口1
        {
                m=RE[0];   //数组的后一个数据赋值给变量m
                switch(m)
                {
                        case 0x01:HAL_UART_Transmit(&USART1_Handler,A1,sizeof(A1),1000);break;
                        case 0x02:HAL_UART_Transmit(&USART1_Handler,A2,sizeof(A2),1000);break;
                        default:HAL_UART_Transmit(&USART1_Handler,buff,sizeof(buff),1000);break;
                }
        }
}

int main(void)
{
        Cache_Enable();                 //打开L1-Cache
        HAL_Init();                                        //初始化HAL库
        Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
        delay_init(216);                //延时函数初始化
        USART1_Init();                  //串口初始化
        HAL_UART_Receive_IT(&USART1_Handler,RE, sizeof(RE)); //开启接收中断

        while(1){}       
}



这是串口助手图,原本应该只发送前面的yes,可default里面的也出来了

这是串口助手图,原本应该只发送前面的yes,可default里面的也出来了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-10-15 11:15:23 | 显示全部楼层
打断点看看switch中m的值是多少
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-16 18:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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