串口调试助手出现乱码

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

然后再依次检查波特率和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)!='\0')  //遇到结束符,退出
  {
    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)!='\0')  //遇到结束符,退出
  {
    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.haha\n");
    delayn(1000000);
  }
}


你可能感兴趣的:(ARM嵌入式)