关于51单片机串口数据丢失问题
关于51单片机的串口通讯程序 丢失数据的问题,用串口调试工具发现,100个数据包里面有10个左右有丢失{dy}个或者第二个数据的现象,调试多次情况一样,用实验板将接受到的数据显示出来,没有发现丢失数据的现象,关键就是在发送阶段,后来发现,有一个关键的细节,在串口初始化中用到定时器T1,并且打开了定时器使能,这样一旦有溢出就发生中断。并且优先级高于串口,所以既有可能丢失数据。一次分析,关掉T0定时器的溢出中断。也可以将串口优先级至{zg},PS=1;于此同时,每次发送数据都要清零发送标志位 while(!TI); TI=0;
init_serial_A() //方式3,SCON=0xd8;ren=1;允许接受串口中断TMOD=0x20; T1=FD: 9600 T1=FA:4800 两种波特率都调试通过。
{ TMOD|=0x20;
SCON|=0xd8;
TL1=0xfA;
TH1=0xfA;
TR1=1; ET1=0;
ES=1;PS=1;
EA=1;
}
init_serial_B() // 方式1,SCON=0x40;ren=0;不允许接受串口中断 T1=FD: 9600 T1=FA:4800 两种波特率都调试通过。
{
TMOD|=0x20;
SCON=0x50;
PCON=0X00; //及smod=0;波特率不加倍
TL1=0xFD;
TH1=0xFf;PS=1;
TR1=1;
ES=1; EA=1; ET1=0;
}
init_serial_C() // 方式1,ren=0;不允许接受串口中断T2定时器9600 波特率都调试通过。
{ SCON|=0X50;
T2CON|=0x1C;
RCAP2H=0XFF;
RCAP2L=0XDB;PS=1;
ES=1; EA=1; ET2=0;
}
init_serial_D() // 0方式 9216 调试未通过。调试助手的波特率不匹配
{SCON|=0X00;
PCON|=0X80; //及smod=1;波特率加倍
ES=1; EA=1; ET1=0;PS=1;
}
init_serial_E() // 方式3,ren=0;不允许接受串口中断T2定时器9340,用9600的波特率有误差。 波特率都调试通过。
{ SCON|=0XC0;
T2CON|=0x1C;
RCAP2H=0XFF;
RCAP2L=0XDb; ET2=0;PS=1;
}
init_serial_F() //方式2 定时器1,波特率9600 波特率都调试通过。
{
SCON=0x50;
TMOD|=0x20;
PCON&=0x00; PS=1;
TL1=0xfd;
TH1=0xfd;
TR1=1; ET1=0;
ES=1; EA=1;
}
init_serial_G() //方式2 定时器1,波特率9600 波特率都调试通过。
{
SCON=0x50;
TMOD|=0x20;
PCON&=0x00; PS=1;
TL1=0xfd;
TH1=0xfd;
TR1=1; ET1=0;
ES=1; EA=1;
}