打印

新手报到,问问前辈串口通信乱码是什么问题

[复制链接]
5109|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abbccc308|  楼主 | 2012-10-28 00:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
因为笔记本没有串口,所以我买的单片机板子用USB下载程序的(是用PL2303HX芯片),但是做串口通信总是乱码,是什么原因啊?
程序如下:
#include<reg52.h>
#include<stdio.h>  //用于调用puts函数
#define FOSC 12000000 //所用的晶振
#define BAUD 9600  //波特率
unsigned char a,flag_uart,flag_on;
void init()
{  TMOD=0x20;  //定时器T1 方式2
   TH1=TL1=-(FOSC/BAUD/32/12);  
   TR1=1;  //启动T1
   SM0=0;  
   SM1=1;    //串口工作方式1
   REN=1;   //串口允许接收数据
   EA=1;   //开总中断
   ES=1;   //开串口中断
}  
void ser() interrupt 4
{  RI=0;    //串口中断标志,接收完成时置1,要由软件清零
   a=SBUF;    //接收到的数据给a
   flag_uart=1;    //接收到数据的标志,在主函数中查询用
   if(a==1)     
      flag_on=1;   
   else if (a==2)   
      flag_on=2;  
   else   
      flag_on=3;
}
void main(void)
{  init();  
   while(1)  
   {   if(flag_uart==1)   //flag_uart为1中断接收到数据
     {  flag_uart=0;   
     ES=0;   //关串口中断,防止发送数据时接到数据进入中断
  TI=1;   //发送中断标志位,发送到停止位时置1,软件清零,因为下面的puts检查到为1时才会发送数据
  switch(flag_on)   
  {  case 1:puts("You input 1\n");     
     break;     
     case 2:puts("You input 2\n");     
     break;   
     case 3:puts("Error\n");   
     break;   
   }  
   while(!TI);  //等待数据发送完成,就是TI置1
   TI=0;    //软件清零
   ES=1;      //打开串口中断
   }
}
}  
现象如图:

KWU]XO@IV]BBI9ZI]P6`7UU.jpg (188.23 KB )

KWU]XO@IV]BBI9ZI]P6`7UU.jpg

相关帖子

沙发
airwill| | 2012-10-29 20:07 | 只看该作者
波特率问题, 也有可能是串口线(有些 usb 串口线高速下会出错误)的问题

使用特权

评论回复
板凳
宝挖小子| | 2012-10-29 22:56 | 只看该作者
你的晶振是多大的?看看下载器STC-ISP显示是多大的?

使用特权

评论回复
地板
ningling_21| | 2012-10-29 23:23 | 只看该作者
字符格式显示没规律的十六进制数,当然是乱码
改选用十六进制显示试试...

使用特权

评论回复
5
jlass| | 2012-10-30 08:47 | 只看该作者
从你的打印输出来看,你收到的是一个循环的数列。
不知道你的发送数据是什么,如果不是循环数列的话就是没收到数据,如果是的话就检查一下配置

使用特权

评论回复
6
zhaofy521| | 2012-10-30 09:45 | 只看该作者
波特率不对吧

使用特权

评论回复
7
宝挖小子| | 2012-10-30 16:55 | 只看该作者
对了,想起来了,12M的晶振是不可以用9600作为波特率的!!!!!!!!!!!

使用特权

评论回复
8
abbccc308|  楼主 | 2012-10-30 18:50 | 只看该作者
谢谢楼上各位了,问题已经解决了,是晶振问题,原是12M,先换成11.0592就好了,谢谢:):)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

90

帖子

1

粉丝