串口调试助手出现乱码

2019-05-20来源: eefocus关键字:串口  调试助手  乱码

首先用一个正确的程序试一下确保软件本身没有什么问题,


然后再依次检查波特率和VPB时钟频率是否匹配,因为它们不匹配的时候同样会出现乱码。


如果最后还是乱码的话,可能就是程序的问题了,需要检查程序是否有语法以外的错误。


自己今天下午调了一个串口发送字符串的程序,就是因为没有把波特率和VPB时钟频率匹配好,导致一直出现乱码


当 UART_BPS 设为9600,Fpclk 为(Fosc/4)*1时是正确的组合,


错误一:UART_BPS 设为9600,Fpclk为 (Fosc/4)*2,出现了乱码,


错误二:UART_BPS 设为115200,Fpclk 为(Fosc/4)*1,出现了乱码


错误三:UART_BPS 设为115200,Fpclk 为(Fosc/4)*2,出现了乱码


程序如下所示:


方法一:


#include


void UART1_Init(void);

void UART1_SendStr(char *Str);

void UART1_SendByte(char byte);

void delayn(unsigned long n);

#define UART_BPS  9600 //设置串口通信波特率


#define Fosc 12000000   //晶振频率


#define Fpclk (Fosc/4)*1 //VPB时钟频率,MD此处公式写错了,导致字符串显示不出


//UART1串口初始化

void UART1_Init(void)

{

  //unsigned char Fdiv;

  U1FCR=1;     //FIFO使能

  U1LCR=0x83;  //使能访问除数锁存,8位字符长度,1个停止位,禁止奇偶产生和校验,

  //Fdiv=(Fpclk/16)/UART_BPS; //设置波特率

  U1DLL=Fpclk/(16*9600);   //除数的底8位

  U1DLM=(Fpclk/(16*9600))>>8;   //除数的高8位

  U1LCR=0x03;       //禁止访问除数锁存器

}

//发送字符串

void UART1_SendStr(char *Str)  

{

  while((*Str)!='')  //遇到结束符,退出

  {

    UART1_SendByte(*Str); //发送数据

    Str++;

  }

}

//发送单个字符

void UART1_SendByte(char byte)

{

  while((U1LSR&0x20)==0); //等待数据发送完毕

   U1THR=byte;  //写入数据

}

//延时函数

void delayn(unsigned long n)

{

  while(n--);

}

int main(void)

{

  PINSEL0=0x00050000; //P0.8,P0.9选择UART0

  UART1_Init();      //UART1串口初始化

  while(1)

  {

    UART1_SendStr("UART1 TEST.n");

    delayn(100000);

  }

}


方法二:


#include


void UART1_Init(void);

void UART1_SendStr(char *Str);

void UART1_SendByte(char byte);

void delayn(unsigned long n);

#define UART_BPS  9600 //设置串口通信波特率


#define Fosc 12000000   //晶振频率

//#define Fcclk (Fosc*4)  //系统频率

#define Fpclk (Fosc/4)*1 //VPB时钟频率,MD此处公式写错了,导致字符串显示不出

//unsigned char Fdiv;

typedef unsigned short U16;

/*************************串口1初始化******************************************/

void UART1_Init ()

{

  U16 Fdiv;

  U0LCR = 0x83;                   // DLAB = 1,可设置波特率

  Fdiv =(Fpclk/16)/UART_BPS;

  U0DLL = Fdiv%256;

  U0DLM = Fdiv/256;

  U0LCR = 0x03;

}

//发送字符串

void UART1_SendStr(char *Str)  

{

  while((*Str)!='')  //遇到结束符,退出

  {

    UART1_SendByte(*Str); //发送数据

    Str++;

  }

}

//发送单个字符

void UART1_SendByte(char byte)

{

  while((U1LSR&0x20)==0); //等待数据发送完毕

   U1THR=byte;  //写入数据

}

//延时函数

void delayn(unsigned long n)

{

  while(n--);

}

int main(void)

{

  PINSEL0=0x00050000; //P0.8,P0.9选择UART0

  UART1_Init();      //UART1串口初始化

  while(1)

  {

    UART1_SendStr("xiao mu lang shi ge da duan dan.hahan");

    delayn(1000000);

  }

}



关键字:串口  调试助手  乱码 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic462258.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:arm7 lpc2148力天电子 PLL实验(一)之PLL中断实验
下一篇:arm 力天电子 lpc2148无字库12864的万年历

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430 串口初始化,及串口操作
#include  <msp430x14x.h> /*    关于UART0串口的配置,及操作函数说明*//* 一、uart0初始化*/ void uart0_idev_init(void){        P3SEL  |= BIT4  + BIT5;     // 1. 选择P3.4和P3.5做UART0通信端口        ME1    |= UTXE0 + URXE0;    // 2. 使能
发表于 2020-03-10
Keil C51 中使用Printf()进行串口输出
如何使用printf在串口显示信息,有两种办法,因为在keil C51中 printf函数是调用putchar进行数据传送的,而putchar应该是先判断TI是否为1,不为1则等待为1。 如果为1则清0,然后送出一个字符。因此如果你直接使用printf函数,你的程序就会在putchar函数中等待TI为1。这时你的程序就相当于直接死掉了。你可以通过改写putchar函数实现自己的目的。TI相当于是初始化不给赋初值就不干活。所以第一种办法就是在初始化的时候,给TI赋值为1,比如void uart_init() {    PCON &= 0x7F; //波特率不倍速 SCON
发表于 2020-03-08
51单片机串口打印不管是中文还是英文都是乱码的问题
讲道理都tm大三暑假了还搞51单片机而且关键是还遇到了一个问题解决了一天才解决出来真的是很丢人了。不过我会珍惜这个机会的,毕竟这有可能是我辈子最后一次跟着老师搞这个破玩意了。好了不废话了 收!昨天遇到的问题是单片机用串口给电脑发数据,本人用串口助手查看时乱码了,发送的数据是英文和数字,没有存在中文,马上进行问题排除:解决方案一:printf的原因吗?代码里用piintf函数来进行串口发送数据,可能printf只适合于stm32不能适用于51,但是仔细一想又不对啊,我tm大三上的单片机大作业就是用printf函数进行串口发送数据的啊,怎么当时就可以啊。于是我把当时的代码拿过来修改,还是不行。解决方案一卒。解决方案二:硬件芯片的原因
发表于 2020-03-08
如何在mcu上使用printf使串口输出
#ifdef __GNUC__   //另外GNU还有一些公用的扩展出来的宏 比如__GNUC__  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf     set to 'Yes') calls __io_putchar() */  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else  #define PUTCHAR_PROTOTYPE int fputc
发表于 2020-03-08
STM8 固件库编写 使用外部晶振串口通信时,发送是乱码
; UART1_ITConfig(UART1_IT_RXNE_OR,ENABLE);  enableInterrupts();   //中断总使能}然后接收到的收据就出现了乱码,我就百度了,有人说需要改宏定义。我就重新看了下stm8s.h文件,发现了端倪#if !defined  HSE_Value #if defined (STM8S208) || defined (STM8S207) || defined (STM8S007) || defined (STM8AF52Ax) ||      defined (STM8AF62Ax) || defined
发表于 2020-03-08
51单片机-串口-串口发送显示
1. 视频bilibili视频地址:https://www.bilibili.com/video/av9293215251单片机-串口-串口发送显示2. 文件文件下载链接:https://download.csdn.net/download/weixin_43130546/122034843. 串口PCON电源管理寄存器SCON串口控制寄存器模式&波特率(宋雪松P183)SCON主要用模式1,的波特率对应的,要用定时器T1&T2的模式2TH1 = TL1 = 256 - 晶振值/12/2/16/波特率(256是TL1的溢出值,12指12个时钟周期,16是硬件因素)SBUF两个SBUF寄存器,分别负责接收和发送缓冲
发表于 2020-03-06
小广播
何立民专栏 单片机及嵌入式宝典

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

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