21ic电子技术开发论坛
标题:
新手报到,问问前辈串口通信乱码是什么问题
[打印本页]
作者:
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; //打开串口中断
}
}
}
现象如图:
作者:
airwill
时间:
2012-10-29 20:07
波特率问题, 也有可能是串口线(有些 usb 串口线高速下会出错误)的问题
作者:
宝挖小子
时间:
2012-10-29 22:56
你的晶振是多大的?看看下载器STC-ISP显示是多大的?
作者:
ningling_21
时间:
2012-10-29 23:23
字符格式显示没规律的十六进制数,当然是乱码
改选用十六进制显示试试...
作者:
jlass
时间:
2012-10-30 08:47
从你的打印输出来看,你收到的是一个循环的数列。
不知道你的发送数据是什么,如果不是循环数列的话就是没收到数据,如果是的话就检查一下配置
作者:
zhaofy521
时间:
2012-10-30 09:45
波特率不对吧
作者:
宝挖小子
时间:
2012-10-30 16:55
对了,想起来了,12M的晶振是不可以用9600作为波特率的!!!!!!!!!!!
作者:
abbccc308
时间:
2012-10-30 18:50
谢谢楼上各位了,问题已经解决了,是晶振问题,原是12M,先换成11.0592就好了,谢谢:):)
欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/)
Powered by Discuz! X3.5