如何通过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
相关产品推荐
相关产品推荐

