关于51单片机串口数据丢失问题

                                关于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;
}



郑重声明:资讯 【关于51单片机串口数据丢失问题】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——