[STM32F4] 使用UART中断接收单个字节

[复制链接]
地瓜patch 发表于 2025-8-27 22:30 | 显示全部楼层 |阅读模式

在STM32CubeIDE上对F446RE开发板进行开发,过UART获取数居出现问题。

当pc发送数组时,只有接受到第一个字节并在STM32的数组中更新,其他字节就没收到。

当前的代码结构如下:

static void MX_USART2_UART_Init(void)
{
/* USER CODE BEGIN USART2_Init 0 */
/* USER CODE END USART2_Init 0 */
/* USER CODE BEGIN USART2_Init 1 */
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
   Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */
/* USER CODE END USART2_Init 2 */
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
   HAL_UART_Receive_IT(&huart2, rx_buff, 5);
   __NOP();
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
   __NOP();
}
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
   __NOP();
}
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
   //HAL_UART_Transmit_IT(&huart2, mess, 20);
HAL_UART_Receive_IT(&huart2, rx_buff, 5);
HAL_UART_Transmit_IT(&huart2, tx_buff, 5);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    HAL_Delay(500);
}
/* USER CODE END 3 */
}



麻花油条 发表于 2025-8-28 15:02 | 显示全部楼层
HAL_UART_RxCpltCallback 实现错误,当前代码在回调函数中再次调用 HAL_UART_Receive_IT,但参数 huart 未正确解引用,这会导致每次回调都重新初始化接收,但可能因竞争条件或缓冲区未正确更新而丢失数据。
duo点 发表于 2025-8-28 15:02 | 显示全部楼层
如果 HAL_UART_Receive_IT 在前一次接收未完成时被再次调用,可能导致数据覆盖或冲突。
onlycook 发表于 2025-8-28 15:03 | 显示全部楼层
在 main() 中调用了 HAL_UART_Receive_IT(&huart2, rx_buff, 5),而回调函数中也调用了相同的函数,可能导致递归或重复初始化。
七毛钱 发表于 2025-8-28 15:03 | 显示全部楼层
在 main() 中只启动一次接收,后续由回调函数自动重启接收
七毛钱 发表于 2025-8-28 15:03 | 显示全部楼层
避免重复初始化接收。
内政奇才 发表于 2025-8-28 15:04 | 显示全部楼层
检查缓冲区大小和作用域,如果需要处理多字节数据,建议在回调中将数据拷贝到另一个缓冲区,避免覆盖。
海滨消消 发表于 2025-8-28 15:05 | 显示全部楼层
UART初始化是否正确?
麻花油条 发表于 2025-8-28 15:05 | 显示全部楼层
可能是HAL_UART_RxCpltCallback 中错误地使用 &huart2 而不是传入的 huart 参数,导致接收逻辑异常。
豌豆爹 发表于 2025-8-28 15:06 | 显示全部楼层
检查硬件连接如UART引脚是否正确配置或尝试降低波特率以排除信号质量问题。
星辰大海不退缩 发表于 2025-8-28 23:36 | 显示全部楼层
UART中断接收稳定性好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1822

主题

14905

帖子

29

粉丝
快速回复 在线客服 返回列表 返回顶部