一、配置STM32cubeMX
二、添加程序
1.main.c中加入
#include "stdio.h"
#define BUFFERSIZE 255 //可以接收的最大字符个数
uint8_t ReceiveBuff[BUFFERSIZE]; //接收缓冲区
uint8_t recv_end_flag = 0 ,Rx_len;//接收完成中断标志,接收到字符长度
/* USER CODE BEGIN 0 */
void uart1_data(void)
{
if(recv_end_flag ==1) //接收完成标志
{
printf("数据长度=%d\r\n",Rx_len); //打印接收到的数据长度
printf("数据内容:");
for(int i=0;i<Rx_len;i++)
{
printf("%c",ReceiveBuff[i]); //向串口打印接收到的数据
}
printf("\r\n");
for(int i = 0; i < Rx_len ; i++) //清空接收缓存区
ReceiveBuff[i]=0; //置0
Rx_len=0; //接收数据长度清零
recv_end_flag=0; //接收标志位清零
}
HAL_UART_Receive_DMA(&huart1,(uint8_t*)ReceiveBuff,BUFFERSIZE);//开启下一次接收
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能串口1 IDLE中断
HAL_UART_Receive_DMA(&huart1,(uint8_t*)ReceiveBuff,BUFFERSIZE);
/* USER CODE END 2 */
在循环中调用uart1_data();
2.stm32f1xx_it.c中加入
/* USER CODE BEGIN TD */
#define BUFFERSIZE 255 //可接收的最大数据量
extern uint8_t recv_end_flag,Rx_len,bootfirst;
/* USER CODE END TD */
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
uint32_t temp;
if(USART1 == huart1.Instance) //判断是否为串口1中断
{
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)== 1) //如果串口1处于空闲状态
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1); //清除中断标志
HAL_UART_DMAStop(&huart1); //停止DMA接收
temp= __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); //获取DMA当前还有多少未填充
Rx_len = BUFFERSIZE - temp; //计算串口接收到的数据个数
recv_end_flag = 1; //接收完成标志
}
}
/* USER CODE END USART1_IRQn 1 */
}
3.usart.c中printf重定向
STM32(keil5)使用printf串口输出(微库法)、usb_printf实现USB虚拟串口输出
三、测试结果
四、例程
STM32CUBEMX配置USART通过DMA方式接收不定长数据https://download.csdn.net/download/qq_33288274/88860394