USART使用串口助手调试时出现乱码的情况,一般都是波特率的问题,例如:向串口发送“hello world\r\n”,但是串口助手收到的数据却是这样: 
usart

于是我仔细检查代码中设置的波特率的大小,发现没错,也是设置为115200,但是串口助手上显示的还是乱码。我再仔细检查与USART相关的代码,包括UASRT初始化、中断、以及发送数据的类型。。。,很绝望,还是没有找出这个BUG! 
以下是我的UASRT相关设置代码:

void Uart1_Init(void)

{

    //GPIO端口设置

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;


    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);        //使能GPIOA的时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);       //使能USART1时钟


    //USART1对应引脚的复用

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);     

    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);    


    //USART1端口配置

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; 

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                  

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                        

    GPIO_Init(GPIOA,&GPIO_InitStructure);                               


    //USART1 初始化

    USART_InitStructure.USART_BaudRate      = 115200;

    USART_InitStructure.USART_WordLength    = USART_WordLength_8b;

    USART_InitStructure.USART_StopBits      = USART_StopBits_1;

    USART_InitStructure.USART_Parity        = USART_Parity_No;

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_InitStructure.USART_Mode          = USART_Mode_Rx | USART_Mode_Tx;    

    USART_Init(USART1, &USART_InitStructure); 


    USART_Cmd(USART1, ENABLE);  //使能USART1


    //开中断

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  


    //Usart1 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;       

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; 

    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;   

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         

    NVIC_Init(&NVIC_InitStructure);                     

}


void USART1_IRQHandler(void)

{

    uint16_t Usart_Data;

   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

   {     

     USART_ClearITPendingBit(USART1,USART_IT_RXNE);

     Usart_Data = USART_ReceiveData(USART1);    

     USART_SendData(USART1, Usart_Data);

   }

}


main函数


int main(void)

{

    int i, len;

    char buffer[20] = {"hello world\r\n"};

    len = strlen(buffer);

    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);

    Systick_Init();

    Uart1_Init();

    while(1)

    {

        for(i=0; i

        {

            USART_SendData(USART1, (uint16_t)buffer[i]);

            while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);

        }

        delay_s(1);

    }

}


。。。找了半天终于把问题找出来了,原来还是波特率的问题。虽然设置USART1时的波特率没错,但是系统的HSE_VALUE(高速外部时钟的值)与开发板实际的值不符,导致开发板串口的波特率与串口助手设置的不一致,这就是出现乱码的原因!USART1是挂载在AHB1,所以HSE_VALUE对UASRT1的波特率有影响。本人使用开发板的HSE为8MHz,而工程中默认为25MHz,故把它改过来即可。

打开工程里面的stm32f4xx.h文件,找到下图位置: 
1

把其中的HSE_VALUE改为开发板实际的值即可 
2

修改好重新编译下载到开发板中运行,此时串口助手能正常显示接收的数据。 
3


关键字:STM32  USART  乱码 引用地址:STM32 USART出现乱码

上一篇:关于STM32F107RCT6使用8M晶振串口波特率错误的问题
下一篇:STM32库文件systemInit 晶振更改默认晶振8M到12M方法

推荐阅读

近日,国内三大安防企业海康威视、大华股份以及宇视科技(千方科技)相继发布2018年上半年业绩报告,呈现出“三足鼎立”之势。其中,海康威视截至今年6月份实现营业总收入208.76亿元(人民币,下同),同比增长26.92%,归属上市公司股东净利润41.47亿元,同比增长26%;大华股份实现营业总收入98.14亿元,同比增长31.47%,归属上市公司股东净利润10...
8月29日至31日,由国家发展改革委、科学技术部、工业和信息化部、国家互联网信息办公室、中国科学院、中国工程院和上海市人民政府共同主办的2019世界人工智能大会(WAIC)将在上海世博中心召开。届时,联合国工发组织总干事李勇,特斯拉CEO马斯克,图灵奖得主罗杰·雷迪,机器学习之父、卡内基梅隆大学计算机学院院长汤姆·米歇尔等一众大咖将云集上海,为...
8月28日,阿石创发布2020年半年度报告,今年上半年阿石创实现营业收入12,464.83万元,较上年同期减少21.47%,其中主营业务收入12,447.67万元,较上年同期减少2.90%;营业利润为-342.46万元,较上年同期减少132.39%;利润总额为-403.16万元,较上年同期减少138.24%;期间归属于上市公司股东的净利润为-275.27万元,较上年同期减少129.51%。据了解,阿石创主...
导读:欧洲电池制造商InoBat公司宣布与美国电池材料供应商Group14 Technologies公司进行合作,将使用Group14的专利硅基负极材料为汽车生产高能量密度的电池。InoBat公司表示,高能量密度电池市场需求飙升,相比传统锂离子电池,硅基负极材料的单位体积能量密度更高。Group14表示,能源部已经认可其“新颖的、可投入使用的纳米材料和可靠的工业规模工艺”...

史海拾趣

问答坊 | AI 解惑

一个有关于DAC0832奇怪的问题请大侠们帮我解一下急,谢谢了,

做一个输入 0~0XFF 的数字量,输出 0~5  V的模拟量,的数模转换! 原理图如下: file:///C:/Documents%20and%20Settings/Administrator/桌面/未命名.bmp 不论输入的数字量是多少,输出的一直是2.85V,R5,R8两端的电压也一直是对稳 ...…

查看全部问答∨

转帖:办公室里的22条潜规则

第一条 必须有一个圈子。无论如何做都是画地为牢:不加入一个圈子,就成为所有人的敌人;加入一个圈子,就成为另一个圈子的敌人;加入两个圈子,就等于没有加入圈子。只有独孤求败的精英才可完全避免圈子的困扰——这种人通常只有一个圈 ...…

查看全部问答∨

变压器铁芯的初始磁化曲线 开关电源原理与设计(连载51)

2-1-1-2.变压器铁芯的初始磁化曲线 下面我们继续对变压器铁芯的磁化过程进行详细分析。图2-3是多个直流脉冲电压连续加到变压器初级线圈a、b两端时,输入脉冲电压与变压器铁芯中磁通密度B或磁通对应变化的曲线图。图2-3-a)为输入电压各个直流脉冲 ...…

查看全部问答∨

请教:如何用手机键盘不用输入法,实现输入英文字母??

RT 小弟是菜鸟,恳请给各位高手指点~~ Win ce5.0中,目前需要抛开输入法,仅使用手机键盘,可以使用一个切换键,比如#,切换进入英文输入状态,再按一次,返回数字状态 请问这该如何实现?…

查看全部问答∨

请教ucos在tms470上移植遇到的问题

我在移植ucos到tms470过程当中,当所有的配置文件修改完了以后,在iar下进行烧写,在烧写过程中报错,开始提示一些.h文件不能找到,后来我将这些文件放到iar的源文件.bin目录下之后,这些文件就能找得到了,但是又有许多.c文件找不到。 请教高手, ...…

查看全部问答∨

串口中断接收不行呢

查询方式接收都行呢,但是中断没反应我看了iar例程和技术手册手册上有个这东西RXNEIE: RXNE Interrupt Enable.This bit is set and cleared by software.0: Interrupt is i ...…

查看全部问答∨

【设计工具】Prototyping a residential gateway using Xilinx ISE

This paper presents a residential gateway (RG) prototyping process using Xilinx Integrated Software Environment (ISE) version 6.1i. The RG was designed for broadband residential multiservices based on a SONET over DWDM (dense wave ...…

查看全部问答∨

稳压电源问题

问一下电源的高手,我的这个电路图做出实物怎么输出只有1.5V且负电压为0V搞不懂。请哪位高手解释。…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved