stm32G4 cubemx串口+DMA接受不定长数据


串口DMA收不定长数据

主要利用了IDLE空闲中断,然后整体验证采用透传,发送后回传数据。
整体流程
1cubemx配置
2接收发送数组,标志位定义,
3中断使能
4中断函数修改
5回调函数修改


一、cubemx配置

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
波特率随便设置,我设置的是1M,注意你的上位机和串口助手是否选择一致的参数
在这里插入图片描述
DMA USART1 TX RX 设置,mode都是normal模式就可以
在这里插入图片描述

二、程序修改

1.初始数组定义

uint8_t		Rx_Flag = 0;         //接收标志位
uint8_t		RecCount = 0;         //个数
uint8_t		Rx_Buf[256];	     //接收缓冲区
uint8_t     Tx_Buf[256];

2.中断使能配置

void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 1000000;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_RS485Ex_Init(&huart1, UART_DE_POLARITY_HIGH, 0, 0) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//开启idle中断
	  HAL_UART_Receive_DMA(&huart1, Rx_Buf, 256);	//开启dma中断
  /* USER CODE END USART1_Init 2 */

}

3.中断函数修改

  */
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 */
	//添加idle中断处理
  if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)  //是否发生idle中断
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);   //清除idle中断
		HAL_UART_IdleCpltCallback(&huart1);   //用户编写的中断回调函数
	}


  /* USER CODE END USART1_IRQn 1 */
}

4.回调函数修改

void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)     //空闲中断函数
{
   Rx_Flag = 1;                                              // 设置接收完成标志
   HAL_UART_DMAStop(huart);                                 // 停止DMA传输
 
   //发生空闲中断时,已接受的数据等于数据总减去dma中待接收的数据
   RecCount= 256 - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);   
 
	 memcpy(Tx_Buf, Rx_Buf, RecCount);                     //内存复制函数
	 memset(Rx_Buf, 0, sizeof(Rx_Buf));                    // 清零接收缓存区
	 HAL_UART_Receive_DMA(&huart1,Rx_Buf, sizeof(Rx_Buf));   //重新开启DMA传输
	 
	
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级馒头神

看看谁给我第一个打赏。太感谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值