×
单片机 > 单片机程序设计 > 详情

串口调试助手出现乱码

发布时间:2020-05-30 发布时间:
|

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


然后再依次检查波特率和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);

  }

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项