STC单片机串口接收数据时,只有第一个字节正确,其它错误,且总漏一个字节,比正常数据短

使用STC 15F2K60S单片机,用串口做接收数据,只第一个数据对,且总少收一个字节。类似的测试在90C516上确完全没问题。(使用单片机内的晶振11.0592MHz,波特率9600,8,1,N,数据为7个字节)
#include "reg52.h"
#include "intrins.h"
#define FOSC 11059200L
#define BAUD 9600

sfr AUXR=0x8e;
sfr T2H=0xd6;
sfr T2L=0xd7;
sbit P22=P2^2;
bit busy,flag2;

unsigned char eee[8];
unsigned char i,a;

void SendData(unsigned char dat);

void main()
{

SCON=0xda;
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
AUXR=0x15;
ES=1;
EA=1;
while(1)
{
if(a>6)
{
for(i=0;i<7;i++)
SendData(eee[i]);
a=0;
}
}

}
void Uart() interrupt 4 using 1
{
if(RI)
{
RI=0;
eee[a]=SBUF;
a++;

}
if(TI)
{
TI=0;
busy=0;
}
}
void SendData(unsigned char dat)
{
while(busy);
ACC=dat;
busy=1;
SBUF=ACC;
}

看一下STC 15F2K60S数据手册,是不是什么寄存器设置的不对。或者是波特率的算法不对。我记得STC好像有的单片机一个时钟周期是两个机器周期。或者是6个机器周期,而一般的单片机都是12个机器周期。这个有一个寄存器可以进行设置,你查一下看是不是这个问题。
T2L=(65536-(FOSC/4/BAUD)); T2H=(65536-(FOSC/4/BAUD))>>8;
去看一下,数据手册,可能是这里出了问题。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-19
#include "reg52.h"
#include "intrins.h"
#define FOSC 11059200L
#define BAUD 9600
sfr AUXR=0x8e;
sfr T2H=0xd6;
sfr T2L=0xd7;
sbit P22=P2^2;
bit busy,flag2;
unsigned char eee[8];
unsigned char i,a;
void SendData(unsigned char dat);
void main(){
SCON=0xda;
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
AUXR=0x15; ES=1;
EA=1;
while(1) {
if(i!=a)
{
SendData(eee[i]);
i++;
i%=7;
} } }
void Uart() interrupt 4 using 1
{
if(RI)
{
RI=0;
eee[a]=SBUF;
a++;
a%=7;
}}
void SendData(unsigned char dat)
{
SBUF=dat;
while(!TI);
TI=0;
}追问

这个程序还是问题依旧呢,程序发给了STC的技术,回复说写的无问题,让自己继续试,郁闷。。。。。

本回答被网友采纳
第2个回答  2013-12-20
我认为片内时钟温漂很大,而且工作在9600那么高的波特率下出错那是在所难免。建议外加11.0592M晶振,或者将波特率降到2400就应该没问题了
第3个回答  2016-08-23
赋值有问题
T2L=(65536-(FOSC/4/BAUD));
T2H=(65536-(FOSC/4/BAUD))>>8;
改成
TL2= RCAP2L=(65536-(FOSC/4/BAUD));
TH2=RCAP2H=(65536-(FOSC/4/BAUD))>>8;
第4个回答  2018-12-16
把自动识别取消,直接写 SCON = 0x50; //8位可变波特率 就可以了!