一、重写printf函数
重写串口1的中断处理函数
#include <stdio.h>
#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;
}
重写串口3的中断处理函数
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
void Usart3_printf(char *format, ...)
{
char buf[512]; //定义临时数组,根据实际发送大小微调
va_list args;
va_start(args, format);
uint16_t len = vsnprintf((char *)buf, sizeof(buf), (char *)format, args);
va_end(args);
HAL_UART_Transmit(&huart3,(uint8_t *)buf,len,1000);
}
切记一定要勾选use microlib
二、 串口初始化使能接收和空闲中断
HAL_NVIC_EnableIRQ(USART1_IRQn);
HAL_NVIC_SetPriority(USART1_IRQn,0,0);
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//接收中断
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//空闲中断
三、定义串口中断函数
usart.h
#define USART1_MAX_RECV_LEN 1000 //最大接收缓存字节数
extern char USART1_RX_BUF[USART1_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN个字节
extern unsigned short USART1_RX_STA;
usart.h
char USART1_RX_BUF[USART1_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN个字节
unsigned short USART1_RX_STA=0;
/* USER CODE BEGIN 1 */
void USART1_IRQHandler(void)
{
uint8_t res = 0;
//接收中断
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) != RESET)
{
HAL_UART_Receive(&huart1,&res,1,1000);
//将数据放入缓冲区
if( (USART1_RX_STA&0x7fff) < USART1_MAX_RECV_LEN)
{
USART1_RX_BUF[USART1_RX_STA] = res;
USART1_RX_STA++;
}
__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);
}
//空闲中断
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET)
{
//一帧数据接收完成
//USART1_IdleCallback(USART1_RX_BUF,USART1_RX_STA&0x7fff);
USART1_RX_BUF[ USART1_RX_STA &0x7fff] = 0;
USART1_RX_STA |= 1 << 15;
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
}
}
四、主函数
if(USART1_RX_STA& 0x8000)
{
printf("%s\r\n",USART1_RX_BUF);
USART1_RX_STA=0;
}
五、完整工程
stm32F103C8T6芯片
链接:https://pan.baidu.com/s/1PvYbvtVqjRqme2qLFKQmvg?pwd=8888
提取码:8888