×
嵌入式 > 嵌入式开发 > 详情

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

发布时间:2020-09-03 发布时间:
|
关于51单片机串口通讯程序 丢失数据的问题,用串口调试工具发现,100个数据包里面有10个左右有丢失第一个或者第二个数据的现象,调试多次情况一样,用实验板将接受到的数据显示出来,没有发现丢失数据的现象,关键就是在发送阶段,后来发现,有一个关键的细节,在串口初始化中用到定时器T1,并且打开了定时器使能,这样一旦有溢出就发生中断。并且优先级高于串口,所以既有可能丢失数据。一次分析,关掉T0定时器的溢出中断。也可以将串口优先级至最高,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;
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机汇编语言 如何实现点亮熄灭二极管