这里使用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'作为结束符,使用串口调试的时候记得“发送新行”,不然标志位会一直处于未接收完成的状态