硬汉嵌入式论坛

 找回密码
 立即注册
查看: 251|回复: 2
收起左侧

[有问必答] STM32F412多串口中断问题

[复制链接]

2

主题

2

回帖

8

积分

新手上路

积分
8
发表于 2025-7-7 19:58:39 | 显示全部楼层 |阅读模式
1、我使用了4个串口,其中两个串口运行的比较频繁;

2、使用HAL_UARTEx_RxEventCallback处理4个串口的rx接收机dma中断;

发现接收数据的时候有丢数的情况,这种可能是什么原因?怎么处理?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-8 09:18:12 | 显示全部楼层
方便的话,需要楼主贴出部分代码看下。
回复

使用道具 举报

2

主题

2

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2025-7-8 10:01:21 | 显示全部楼层
/**
  * @brief USART1 Initialization Function
  * @param None
  * @retval None
  */
static 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 = 115200;
  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;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */
  huart_group[0] = huart1; //COM_USER  
  __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
  //__HAL_DMA_ENABLE_IT(&hdma_usart1_rx,DMA_IT_TC);
  HAL_UARTEx_ReceiveToIdle_DMA(&huart1,user_dmarx_buff,DMABUFF_LEN);
  __HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
  /* USER CODE END USART1_Init 2 */

}



/**
  * @brief  Reception Event Callback (Rx event notification called after use of advanced reception service).
  * @param  huart UART handle
  * @param  Size  Number of data available in application reception buffer (indicates a position in
  *               reception buffer until which, data are available)
  * @retval None
  */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
  uint8_t* buffptr = NULL;
  uint8_t com;
  bool status;
  //uint16_t remaining,rx_length;
  //
  HAL_UART_DMAStop(huart);  // 优先停止DMA传输
  //
  if (huart->Instance == USART1)
  {
    buffptr = user_dmarx_buff;
    com = COM_USER;
  }
  else if(huart->Instance == USART2)
  {
    buffptr = eg916_dmarx_buff;
    com = COM_EG916GL;
  }
  else if(huart->Instance == USART3)
  {
    buffptr = m992_dmarx_buff;
    com = COM_M992INS;
  }
  else if(huart->Instance == USART6)
  {
    buffptr = radio_dmarx_buff;
    com = COM_M5RADIO;
  }
  else
  {
    buffptr = NULL;
  }
  //
  if(buffptr)
  {
    //HAL_UART_DMAStop(huart);  // 停止DMA传输
    //remaining = __HAL_DMA_GET_COUNTER(huart->hdmarx);
    //rx_length = DMABUFF_LEN - remaining;
    //UART_QUE_WRITE(&m_nUART_RXQUE[com],buffptr,rx_length);
    UART_QUE_WRITE(&m_nUART_RXQUE[com],buffptr,Size);
    uartdeal_queue_item.message_id = com;
    //uartdeal_queue_item.param_length= Size;
    osMessageQueuePut(msg_queue_uartdeal_id,&uartdeal_queue_item,NULL,NULL);
    //for test
    if(Size > 1000)
    {
       uartdeal_queue_item.message_id = com;
    }
    //// 继续接收数据
    HAL_UARTEx_ReceiveToIdle_DMA(huart, buffptr, DMABUFF_LEN);
  }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 02:56 , Processed in 0.041269 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表