You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过ESP32输入动态修改STM32 UART波特率?

问题:运行时通过ESP32修改STM32 UART波特率失败

我正尝试在运行时通过ESP32的UART输入修改STM32的USART2波特率,计划向STM32发送uint32类型的波特率值,STM32接收后反初始化当前UART,再用新波特率重新初始化。但当前操作未生效,无法判断是数据未正确传输,还是接收后修改逻辑有问题。附上相关代码,刚接触STM32编程,求帮助:

uint8_t Rx_data[100] = "<Hello World\n>";
int baud = 115200;
uint8_t Tx_data[100];
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_USART1_UART_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */

// Transmit data via UART

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // Blink
//    HAL_Delay(1000); // Delay blink for 1 second

HAL_UART_Receive(&huart1, (uint8_t*)Tx_data, 100, 100); // Receive comms from ESP32

  uint8_t Tx_value = Tx_data;

  if(baud != Tx_value) {
      HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // Blink
      HAL_Delay(1000); // Delay blink for 1 second

      baud = Tx_value;
      Change_baud(baud);

  }

  HAL_UART_Transmit(&huart2,(uint8_t*) Tx_data, 100, 100); // Transmit comms from ESP32 to terminal

  HAL_UART_Transmit(&huart1, Rx_data, sizeof(Rx_data), 100);

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
 //HAL_UART_Receive(&huart2, Rx_data, 4, 1000);

}
 /* USER CODE END 3 */
}

void Change_baud(int baud) {
HAL_UART_DeInit(&huart2);
MX_USART2_UART_Init_baud(baud);
HAL_UART_Receive_IT(&huart2, (uint8_t*)Rx_data, 100);

}
static void MX_USART2_UART_Init_baud(int baud)
{

 /* 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 = baud;
 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 */

 }

问题分析与解决建议

1. 数据接收与解析错误(核心问题)

代码存在严重类型错误,导致无法正确获取ESP32发送的波特率值:

  • HAL_UART_Receive(&huart1, (uint8_t*)Tx_data, 100, 100); 接收100字节,但实际仅需接收uint32类型(4字节),长度设置不合理。
  • uint8_t Tx_value = Tx_data; 把数组指针直接赋值给uint8_t变量,拿到的是数组首地址的低8位,完全不是ESP32发送的波特率数值。

修正方法:
直接接收4字节到uint32_t变量,再进行判断:

uint32_t new_baud;
// 接收ESP32发送的uint32波特率值,超时设为合理值(比如500ms)
if(HAL_UART_Receive(&huart1, (uint8_t*)&new_baud, sizeof(uint32_t), 500) == HAL_OK) {
    // 注意字节序:若ESP32与STM32字节序不同(通常均为小端,无需转换),可使用__REV(new_baud)转换
    if(baud != new_baud) {
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
        HAL_Delay(1000);
        baud = new_baud;
        Change_baud(baud);
        // 可选:向ESP32发送确认指令,通知其同步修改波特率
        HAL_UART_Transmit(&huart1, (uint8_t*)&baud, sizeof(uint32_t), 100);
    }
}

2. 波特率修改逻辑的潜在问题

  • Change_baud函数中调用了HAL_UART_Receive_IT(&huart2, ...),但主循环仍有HAL_UART_Transmit(&huart2, ...)的轮询操作,可能导致中断与轮询模式冲突,建议统一使用一种通信模式。
  • 确保MX_USART2_UART_Init_baud函数中,huart2的其他参数(数据位、停止位等)与初始配置一致,避免修改波特率时改变其他通信参数。

3. 调试建议

  • 先验证数据传输链路:接收完成后,将new_baud通过USART2发送到终端,查看是否与ESP32发送的数值一致,确认传输是否正常。
  • 波特率修改后,必须同步修改ESP32的UART波特率,两边参数一致才能正常通信,否则会出现乱码。

内容的提问来源于stack exchange,提问作者Aaron Underwood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:40:43