串口发送接收数据乱码
我的单片机串口发送和接收数据的时候老是乱码,波特率的设置我已经试过各种了,还是一样,请问这个问题如何解决呢?
[解决办法]
可能问题:
1、线路连接问题,检查线路,看看是否有错。
2、干扰问题,是否有干扰源?增强接地。
3、串口配置,检查一下,有时候波特率过高会导致这样的情况。
4、你的程序,这个可能性不大,但也是有的。
[解决办法]
假如有示波器的话,楼主,可以从根源一步一步的跟踪UART信号。看到哪里出问题了。。
[解决办法]
乱码还是波特率的设置问题。你那个波特率计算公式不对,所以你初始化设置的实际初值与你计算的数值时不相等的。波特率不对就会出现乱码。我的那个串口发送机就是这样,波特率公式不对。还有就是你发送和接收的格式要想好,调节准确。。。这样你实验几下就行了。如果你的晶振是11.0592M的话,那么9600波特率的初值是TH1=TL1=0xfd;SMOD=0;如果是电脑发送给单片机的话,那么你发送的一般来说默认的是ASSIIC码形式,你那边接收也显示也要是ASSIIC码格式。再自己试试就差不多了。。。。
[解决办法]
#define GetSystemClock() (80000000ul) 这是多少晶震?8千万? 80M ?
下载一个软件自己生成一下都不想搞?还非要等别人给你生成好?
假定晶震是8MHZ的,很难产生一个准确的波特率,用定时器1
//////////////////////////////////////////////////////////////////////////// 名称: SIO_Init// 说明: 8.0MHZ晶震下初始化串口波特率为1200bps// 8位数据位,1位停止位,无校验// 返回: void void SIO_Init(void){ ////////////////////////////////////// // 禁止串口中断 ES = 0; ////////////////////////////////////// // SCON // D7 D6 D5 D4 D3 D2 D1 D0 // SM0 SM1 SM2 REN TB8 RB8 TI RI // 0 1 0 0 0 0 0 0 // // SM0=0 SM1=1 -> 8位UART 波特率可变 SCON = 0x40; ////////////////////////////////////// // TMOD // D7 D6 D5 D4 D3 D2 D1 D0 // GATA C/T M1 M0 GATA C/T M1 M0 // 0 0 1 0 ? ? ? ? // // 定时器1定时方式2说明: // 把16位计数器分为两部分,即以TL0为计数器, // 以TH0作为预置寄存器。初始化时把计数初值分别 // 加载至TL和TH中。当计数溢出时,由预置寄存器TH // 以硬件方法自动给计数器TL重新加载。 // TMOD &= 0x0F; TMOD |= 0x20; TH1 = 0xDD; TL1 = 0xDD; ////////////////////////////////////// // PCON // D7 D6 D5 D4 D3 D2 D1 D0 // SMOD - - - GF1 GF0 PDWN IDLE PCON |= 0x80; ////////////////////////////////////// TR1 = 1;// 启动定时器 REN = 1;// 允许串口接收数据 ES = 1;// 开启串口中断 ////////////////////////////////////// // EA // D7 D6 D5 D4 D3 D2 D1 D0 // EA - ET2 ES ET1 EX1 ET0 EX0 // // 建议在全部初始化完成后,在主程序中启用 // EA = 1; //}