串口收发大数据和接收发送不定长数据

一.首先是大家想知道的接收发送不定长数据

这里我仅仅推荐一种方法,虽然有很多方法STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA_idle line detection interrupt-CSDN博客

但是我还是仅仅推荐我这种:利用HAL库的 HAL_UARTEx_ReceiveToIdle_DMA()函数,代码简洁。在HAL里面能用回调函数直接实现功能的就别去自己写逻辑代码

配置就是打开串口中断和DMA接收和发送,注意中断优先级要比系统时钟中断优先级低,

1.首先在usart.c的串口初始函数里面(打开DMA接收,关闭DMA传输一半回调函数)

uint8_t receiveData[100];
  /* USER CODE BEGIN USART2_Init 2 */

  HAL_UARTEx_ReceiveToIdle_DMA(&huart2, receiveData, sizeof(receiveData));
//对应回调函数void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
  __HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);

  /* USER CODE END USART2_Init 2 */

2.在主函数里面写回调函数

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart == &huart2){
		 HAL_UART_Transmit_DMA(&huart2, receiveData, Size);

	}
	HAL_UARTEx_ReceiveToIdle_DMA(&huart2, receiveData, sizeof(receiveData));
	__HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);
}

if是huart2就发数据即可,回调函数最后是重新打开DMA接收,以及再次关闭DMA传输一半回调函数。没了就这么简单(用回调函数)

二.串口收发大数据

串口接收音频数据,然后再通过串口发出去

usart.c
uint8_t tx_buffer[512]={0};  //接收数据缓存数组
uint8_t rx_buffer[512]={0};  //接收数据缓存数组
usart.h
#define BUFFER_SIZE  512
extern uint8_t tx_buffer[512];  //接收数据缓存数组
extern uint8_t rx_buffer[512];  //接收数据缓存数组

1.初始化里面打开串口接收

 在USART6_Init函数里面
 /* USER CODE BEGIN USART6_Init 2 */
  
  //DMA接收函数,此句一定要加,不加接收不到第一次传进来的实数据,是空的,且此时接收到的数据长度为缓存器的数据长度
  HAL_UART_Receive_DMA(&huart6,rx_buffer,BUFFER_SIZE);
  
  /* USER CODE END USART6_Init 2 */

2.在回调函数里面发送就可以

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	 	if(huart == &huart6){
		 HAL_UART_Transmit_DMA(&huart6, tx_buffer, BUFFER_SIZE);
		}
}

你可能感兴趣的:(单片机,嵌入式硬件)