stm32用printf串口通讯到PC端,发生吞字符的情况

在将开发版中的数据传输到PC端时,用DB9转USB接口传输,发现只有printf这一步会出现输出内容首字母消失的情况,且出现乱码,比如原本输出是abcd,但在PC端就是bcd,且会不断消失。但波特率和数据位停止位确定是正确的。

img

img

发送单个字符是正确的吗?

STM32串口通讯数据丢失原因分析及解决办法_stm32串口dma发送数据丢失_jj198311的博客-CSDN博客 在进行串口通讯实验时,一时不仔细可能会发现通讯不正常,数据丢失的现象,包括丢失第一个字符,或只收到最后一个字符等等,本文接下来将就这类问题展开讨论。首先是通过MCU向上位机发送数据:若程序如下图所示,直接发送数据,由于数据缓冲区(TDR)向移位寄存器发送数据是并行发送,时间较快,而从移位寄存器向外传输数据是串行输出,耗时较长,如此可能导致数据丢失多个,或只接收到最后一个,因为后面并行传输的快,还没等数据发送完成,下一个数据就覆盖住了上一个数据。如此,有两种解决办法;一,添加发送..._stm32串口dma发送数据丢失 https://blog.csdn.net/jj198311/article/details/122409788

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/1094669
  • 以下回答由chatgpt基于相关博客总结生成:

    解决方案:

    问题出现的原因可能是由于printf函数的默认输出流重定向导致的字符丢失和乱码。为了解决这个问题,可以通过重定向输出流到串口,而不使用printf函数来进行串口通讯。

    下面是一种可能的解决方案:

    1. 在代码中包含必要的头文件:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "stm32fxxx.h" // 根据具体使用的型号选择合适的头文件
    
    1. 创建一个名为 "uart_printf" 的函数,用于重定向printf函数的输出流到串口。在该函数内部,将字符逐个发送到串口的数据寄存器中。
    int uart_printf(char ch)
    {
        while (!(USART1->SR & USART_SR_TC));
        USART1->DR = ch;
        return ch;
    }
    
    1. 在main函数的开头,将printf函数的输出流重定向到 "uart_printf" 函数。
    int main(void)
    {
        // ...
    
        // 重定向printf函数的输出流到串口
        if (SysTick_Config(SystemCoreClock / 1000))
        {
            while (1);
        }
    
        // ...
    
        // 进入主循环
        while (1)
        {
            // ...
        }
    }
    
    1. 修改USART1串口的初始化代码,确保串口的设置与PC端的设置一致。下面以波特率为115200、数据位为8位、停止位为1位的设置为例:
    void init_usart1(void)
    {
        // 启用USART1时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    
        // 配置USART1引脚
        GPIO_InitTypeDef GPIO_InitStruct;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
    
        // 配置USART1的工作模式
        USART_InitTypeDef USART_InitStruct;
        USART_InitStruct.USART_BaudRate = 115200;
        USART_InitStruct.USART_WordLength = USART_WordLength_8b;
        USART_InitStruct.USART_StopBits = USART_StopBits_1;
        USART_InitStruct.USART_Parity = USART_Parity_No;
        USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStruct.USART_Mode = USART_Mode_Tx;
        USART_Init(USART1, &USART_InitStruct);
    
        // 启动USART1
        USART_Cmd(USART1, ENABLE);
    }
    

    确保以上代码的正确配置并编译烧录到stm32开发板中。

    通过以上步骤,你就可以在stm32开发板上通过printf函数将数据传输到PC端的串口,而不会出现字符丢失和乱码的情况。

    请注意,具体的代码实现可能因使用的stm32开发板型号和开发环境的不同而有所差异,因此在实际应用中可能需要根据具体情况进行修改。另外,串口通讯可能还涉及到其他的配置和处理,以上仅为一个基本的示例方案,具体实现还需根据实际情况进行调整。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^