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