单片机串口通信问题

我已经把串口中断简化的非常少了,为什么一次发送9个字符有时候会漏掉一个。。。代码是在测试PC与单片机通信,用PC发送9个字符给单片机,保存在一个数组里,然后将数组内容发送给PC
#include<reg52.h>
#include<string.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P2^3;
sbit d1=P1^0;
sbit d2=P1^1;
sbit d3=P1^2;
sbit d4=P1^3;
uchar code table0[]={"AT&F"};
uchar code table[]={"AT"};
uchar code compare[]={0x41,0x54,0x0D,0x0D,0x0A,0x4F,0x4B,0x0D,0x0A};
uchar read[10],temp[30];
uchar i,flag,flag1,num=0,n;
void delay(uint z);
void initial();

void main()
{
initial();
ES=0;
for(i=0;i<4;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
ES=1;
d3=0;
while(1)
{
if(num==10)
{
num=0;
// flag=0;
for(i=0;i<9;i++)
{
read[i]=temp[i+1];
}
ES=0;
for(i=0;i<9;i++)
{
SBUF=read[i];
while(!TI);
TI=0;
}
flag1=1;
ES=1;
}
/* for(i=0;i<9;i++)
{
if(read[i]=='O'||read[i]=='K')
d1=0;
} */
}
}

void initial()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
TI=0;
RI=0;
}

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void ser() interrupt 4
{
RI=0;
temp[num]=SBUF;
num++;
}
你这里 read[i]=temp[i+1]; 是怎么回事呢?不取第一个?
我感觉您可以试拆颂试直接将temp里面的数据发送出去看看,不要经过那么多转换。看看是否OK。要么就先一个一个字节的接受,然后直接将这个数发送回去看看。肯定可以找到问题点的笑咐所在。你可以试试
if(num >= 10)
{
num=0;
flag = 0;
for(i=0;i<9;i++)
{
SBUF = temp[i];
}
flag = 1;
}

而这里改成
void ser() interrupt 4
{
RI=0;
if (flag)
{
temp[num]=SBUF;
num++;
}
}
这样保证了数据不被重叠,当然还有更好的办法,您可以试试这碰御纯样调试一下,看看能否通过咯,哈哈哈。
我没看你程序 不过你看下你的波特率误差有多少 太多的话就换个晶振或换个波特率
在每次发送数据的地方 加一个短的延时程序 再看下 还有没有问清缺题

for(i=0;i<答庆辩9;i++)
{
SBUF=read[i];
while(!TI);
TI=0;
//这个地方加个延时2MS
}

for(i=0;i<4;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
//这差孝个地方加个延时2MS

}