串口结构体 串口变量定义 接收初始化 主函数检测到标志后,进行数据处理(此时如果在中断函数中继续接收数据,始终接收完整数据,应该没有影响吧?),接着清空缓冲区,清除标志位。1. CubeMX配置



2. 程序配置
/* 串口数据类型 */ typedef struct { /* 数据接收标志 */ uint8_t usart_recv_flag; /* 数据解析长度 */ uint16_t usart_recv_len; /* DMA 数据长度 */ uint16_t usart_dma_recv_len; /* 数据解析缓冲区 */ uint8_t usart_recv_buffer [USART_RECV_SIZE]; /* DMA 数据缓冲区 */ uint8_t usart_dma_recv_buffer [USART_DMA_RECV_SIZE]; }ts_usart_type; #define USART_DMA_RECV_SIZE 256 #define USART_RECV_SIZE 1024 ts_usart_type usart_nb_type = {.usart_recv_flag = 0, .usart_recv_len = 0}; /* 1. 打开串口空闲中断 */ __HAL_UART_ENABLE_IT(&huart1 ,UART_IT_IDLE ); /* 2. 清除空闲中断标志 */ __HAL_UART_CLEAR_IDLEFLAG(&huart1); /* 3. 打开 DMA 接收 */ HAL_UART_Receive_DMA(&huart1 ,usart_nb_type.usart_dma_recv_buffer, USART_DMA_RECV_SIZE); stm32f4xx_it.c
void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ uint32_t temp; /* 1. 判断空闲中断 */ if(__HAL_UART_GET_FLAG(&huart1 , UART_FLAG_IDLE) != RESET) { /* 2. 清除中断 */ __HAL_UART_CLEAR_IDLEFLAG(&huart1); /* 3. 停止 DMA 接收 */ HAL_UART_DMAStop(&huart1); //清除 DMA 接收中断,只需读取一次状态寄存器和数据寄存器,即可实现 temp = huart1.Instance->SR; temp = huart1.Instance->DR; /* 4. 获取 DMA 接收数据长度 : NDTR 为递减计数器,故 SIZE - NDTR*/ temp = USART_DMA_RECV_SIZE - hdma_usart1_rx.Instance->NDTR; usart_nb_type.usart_dma_recv_len = temp; /* 5. 串口回调函数 */ HAL_UART_RxCpltCallback(&huart1); } /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ /* 6. 开启 DMA 接收 */ HAL_UART_Receive_DMA(&huart1 ,usart_nb_type.usart_dma_recv_buffer ,USART_DMA_RECV_SIZE); /* USER CODE END USART1_IRQn 1 */ } bsp_usart.c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* 1. 判断是否为 NB 串口 */ if(huart->Instance == huart1.Instance) { /* 2. 判断是否有未处理的数据 */ /* 有,从地址 0+old_len 开始获取 DMA 接收区数据。 */ if(usart_nb_type.usart_recv_len > 0) { rt_memcpy(&usart_nb_type.usart_recv_buffer[usart_nb_type.usart_recv_len] ,usart_nb_type.usart_dma_recv_buffer ,usart_nb_type.usart_dma_recv_len); usart_nb_type.usart_recv_len += usart_nb_type.usart_dma_recv_len; } /* 无,从地址 0 开始获取 DMA 接收区数据。 */ else { rt_memcpy(usart_nb_type.usart_recv_buffer ,usart_nb_type.usart_dma_recv_buffer ,usart_nb_type.usart_dma_recv_len); usart_nb_type.usart_recv_len = usart_nb_type.usart_dma_recv_len; } /* 3. 清空 DMA 接收区 */ rt_memset(usart_nb_type.usart_dma_recv_buffer ,0 ,usart_nb_type.usart_dma_recv_len); /* 4. 清空 DMA 接收长度 */ usart_nb_type.usart_dma_recv_len = 0; /* 5. 置位数据接收标志 */ usart_nb_type.usart_recv_flag = 1; } } main.c
/* 1. 判断是否有完整数据 */ if(usart_nb_type.usart_recv_flag == 1) { /* 2. 打印数据到指定串口 */ HAL_UART_Transmit(&huart2 ,usart_nb_type.usart_recv_buffer ,usart_nb_type.usart_recv_len ,100 ); /* 3. 清空接收缓存区 */ rt_memset(usart_nb_type.usart_recv_buffer ,0 ,usart_nb_type.usart_recv_len); /* 4. 清空数据接收标志 */ usart_nb_type.usart_recv_flag = 0; /* 5. 清空数据接收长度 */ usart_nb_type.usart_recv_len = 0; } 3. 备注
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算
官方软件产品操作指南 (170)