各位大侠,51单片机串口中断接收问题?为什么一个一个字节的发,串口都可以接收,而连续发4个十六进制

程序如下:
#include <AT89X52.H>
#include <string.h>
int ch=0,num=0,Rbuf_flag=0;
unsigned char Rbuf[10]={0};
void init_ser( void )
{
SCON=0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
//UART为模式1,8位数据,允许接收
TMOD=0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
//定时器1为模式2,8位自动重装
PCON=0x80 ; //SMOD=1;
TH1=0xFD ; //Baud:19200 fosc="11".0592MHz
IE=0x90 ; //Enable Serial Interrupt
TR1= 1 ; // timer 1 run
TI=1;
}
//串口接收中断函数
void serial() interrupt 4 using 3
{
if(RI==1)
{
RI=0;
ch=SBUF;
}
if(ch==0x05)
{
Rbuf_flag=1;
num=0;
}
if(Rbuf_flag==1)//开始标志位
{
Rbuf[num++]=ch; //接收0x05

}
if(ch==0x01)////////结束标志位
{
Rbuf_flag=0;
num=0;
}
SBUF= Rbuf[0];
while(TI== 0);
TI=0 ;
SBUF= Rbuf[1];
while(TI== 0);
TI=0 ;
SBUF= Rbuf[2];
while(TI== 0);
TI=0 ;
SBUF= Rbuf[3];
while(TI== 0);
TI=0 ;
}
main()
{
num=0;
init_ser(); //初始化串口
while(1);
}

上面的串口中断程序大意是当串口接收到0x05时,置开始标志位,开始接收数据,当接收到0x01时,接收结束。
问题是,我用串口调试助手一个一个字节的发,比如先发05,再发00,再发04,再发01,这样是没问题的,Rbuf数组依次接收到05,00,04,01。而如果是输上05000401,点击发送,单片机只能接收到前两个字节,后两个没有接收到,这是怎么回事呢?

每次进中断你都回发Rbuf[]数组(4个字节),更要命的是你居然还敢在中断函数里面while(TI==0)。
你可以看看在串行中断函数里面浪费了多少时间。
51的串口只有一个移位寄存器。第一次进入中断后你读出了1个字节,然后移位寄存器里面又收到1个字节,剩下的再来就被丢掉了……因为老兄你还在第一次进入的中断里面悠哉悠哉地耍呢。
温馨提示:答案为网友推荐,仅供参考
相似回答