[笔记]STM32基于HAL库实现STM32串口中断接收数据

这里使用USART1串口

usart.c中添加

(1)添加全局变量

uint8_t USART1_Buff[100] = {0};            //接收帧缓存,自己定义大小
uint8_t USART1_STA = 0;
bool USART1_Receive_Flag = false;
uint8_t res              = 0;

(2)在MX_USART1_UART_Init()最后添加

HAL_UART_Receive_IT(&huart1, &res, 1);

(3)在后面空白处添加

fputc是重定向,目的是将printf输出的目标改为usart1串口上

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

    if(huart1.Instance == USART1)   // 判断是由哪个串口触发的中断
    {
        if((res == '\r' || res == '\n') && USART1_Receive_Flag == false)
        {
            USART1_Buff[USART1_STA] = 0;
            USART1_STA = 0;
            printf("buff = %s\r\n",USART1_Buff);
            USART1_Receive_Flag = true;
        }
        else if(USART1_Receive_Flag == false)
        {
            USART1_Buff[USART1_STA] = res;
            USART1_STA++;
        }
        HAL_UART_Receive_IT(&huart1,&res,1);      // 重新使能串口1接收中断
    }
}

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif 
PUTCHAR_PROTOTYPE
{
	HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}

在usart.h中添加

extern uint8_t USART1_Buff[100];            //接收帧缓存,自己定义大小
extern uint8_t USART1_STA;
extern bool USART1_Receive_Flag;

在main.c中的死循环中添加

if(USART1_Receive_Flag == true)
{
        printf("buff = %s\r\n",USART1_Buff);
        USART1_Receive_Flag = false;
}

别忘了在main.h中添加

#include <stdio.h>
#include <stdbool.h>

结果:

注意!!!:串口一使用的是'\r' || '\n'作为结束符,使用串口调试的时候记得“发送新行”,不然标志位会一直处于未接收完成的状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值