Xsies 2026-01-16 15:31 采纳率: 25%
浏览 2

stm32串口发送问题


void usart_test(void)

{
static uint8_t flag = 0;
char text01[20];

sprintf(text01,"Lan Qiao Bei\r\n");

HAL_UART_Transmit(&huart1,(uint8_t*)text01,sizeof(text01),HAL_MAX_DELAY);
HAL_UART_Transmit(&huart2,(uint8_t*)text01,sizeof(text01),HAL_MAX_DELAY);

flag++;

sprintf(text,"%d",flag);
LCD_DisplayStringLine(Line5,(unsigned char*)text);

HAL_Delay(1000);
}

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_TIM2_Init();
MX_TIM3_Init();
MX_TIM4_Init();
MX_ADC1_Init();
MX_ADC2_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
/ USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
LCD_Init();

LCD_SetBackColor(Black);
LCD_SetTextColor(White);
LCD_Clear(Black);

LCD_DisplayStringLine(Line0,(unsigned char*)"helloworld");

HAL_TIM_Base_Start_IT(&htim4);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
// HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);
HAL_ADC_Start(&hadc1);
HAL_ADC_Start(&hadc2);

/* USER CODE END 2 */

/* Infinite loop /
/ USER CODE BEGIN WHILE */
while (1)
{

  usart_test();

    
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}

![img](https://i-blog.csdnimg.cn/ask/5bb94630b2394e3296c58458eb956672.jpeg "#left")


这是什么问题啊

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-16 15:32
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    根据你提供的代码和描述,问题集中在 STM32串口发送数据有问题。我们来逐步分析可能的原因,并给出解决方案。


    一、问题分析

    从你提供的代码中可以看出,usart_test() 函数的作用是:

    1. 使用 sprintf 构造一个字符串 "Lan Qiao Bei\r\n"
    2. 通过 HAL_UART_Transmit 分别发送到 USART1USART2
    3. 每次调用该函数后,flag 增加,并显示在 LCD 上;
    4. 程序循环调用 usart_test(),每隔 1 秒执行一次。

    问题表现:

    • 串口发送的数据可能没有正确显示;
    • 或者只发送了一部分数据;
    • 或者没有收到任何数据(比如使用串口助手查看不到输出)。

    二、可能的问题原因

    1. UART 初始化未完成

    • 你虽然调用了 MX_USART1_UART_Init();MX_USART2_UART_Init();,但需要确认这些函数是否成功初始化了两个 UART 接口。
    • 如果没有正确配置波特率、数据位、停止位等参数,会导致通信失败。

    2. 缓冲区大小不匹配

    • 你使用 sizeof(text01) 来作为发送长度,而 text01 是一个字符数组,其大小为 20 字节。
    • 但是 sprintf(text01,"Lan Qiao Bei\r\n"); 实际写入的字符数可能小于 20,导致发送时多出无效字符(如 \0),影响接收端解析。

    3. 串口线连接问题

    • 可能是物理连接错误,例如 TXD 与 RXD 接反,或者没有接好;
    • 或者使用的是 USB 转串口模块,驱动或 COM 口选择错误。

    4. LCD 显示与串口打印冲突

    • usart_test() 中同时更新 LCD 显示,可能导致程序运行异常,尤其是当 HAL_UART_Transmit 阻塞时间过长时。

    5. 串口未启用中断或 DMA

    • 如果你使用的是非阻塞方式(如中断或 DMA),而当前代码使用的是 HAL_MAX_DELAY,即阻塞模式,那么应确保 HAL_UART_Transmit 正确执行。

    三、解决方案

    ✅ 1. 检查 UART 初始化是否正确

    请确认你的 MX_USART1_UART_Init()MX_USART2_UART_Init() 是否如下所示(以 HAL 库为例):

    void MX_USART1_UART_Init(void)
    {
        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;
        HAL_UART_Init(&huart1);
    }
    

    注意: 请确保 USART1USART2 的引脚配置正确(如 PA9/PA10 对于 USART1,PA2/PA3 对于 USART2)。


    ✅ 2. 修正发送长度

    由于 text01 是一个固定大小的数组,使用 sizeof(text01) 会发送全部 20 字节,包括末尾的 \0,这可能导致接收端误读。

    建议改为实际字符串长度:

    uint16_t len = strlen(text01);
    HAL_UART_Transmit(&huart1, (uint8_t*)text01, len, HAL_MAX_DELAY);
    HAL_UART_Transmit(&huart2, (uint8_t*)text01, len, HAL_MAX_DELAY);
    

    重点: 使用 strlen 获取实际字符串长度,避免发送多余字节。


    ✅ 3. 确认串口连接和调试工具设置

    • 确保串口线连接正确(TX -> RX,RX -> TX);
    • 确认串口助手(如 XCOM、SecureCRT、Putty)使用的 COM 口与 STM32 连接的端口一致;
    • 检查波特率是否与 STM32 设置的一致(如 115200)。

    ✅ 4. 优化 LCD 显示逻辑

    如果 LCD 显示操作较慢,可能会干扰串口发送。建议将 LCD 显示移到主循环中,而不是每次调用 usart_test() 时都刷新。


    ✅ 5. 修改后的完整代码示例

    void usart_test(void)
    {
        static uint8_t flag = 0;
        char text01[20];
    
        sprintf(text01, "Lan Qiao Bei\r\n");
        uint16_t len = strlen(text01);
    
        // 发送至 USART1 和 USART2
        HAL_UART_Transmit(&huart1, (uint8_t*)text01, len, HAL_MAX_DELAY);
        HAL_UART_Transmit(&huart2, (uint8_t*)text01, len, HAL_MAX_DELAY);
    
        flag++;
        char text[10];
        sprintf(text, "%d", flag);
        LCD_DisplayStringLine(Line5, (unsigned char*)text);
    
        HAL_Delay(1000);
    }
    

    四、总结

    | 问题点 | 解决方案 | |--------|----------| | UART 初始化不正确 | 检查 MX_USARTx_UART_Init() 配置 | | 缓冲区大小不匹配 | 使用 strlen() 替代 sizeof() | | 串口连接错误 | 检查硬件连接和 COM 口设置 | | LCD 显示干扰 | 将 LCD 显示移至主循环中 |


    如果你仍然无法看到串口输出,请提供以下信息以便进一步排查:

    • 你使用的开发板型号(如 STM32F103C8T6);
    • 你使用的串口助手及设置;
    • 你是否使用了正确的 GPIO 引脚;
    • 是否有其他功能正在占用串口资源(如 ADC、TIM);

    欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 修改了问题 1月16日
  • 创建了问题 1月16日