|
关于单片机与PC机的串口通信问题。请高手指点。急!
[复制链接]
我做了一个串口通信模块,但不知道是为什么,单片机刚开始工作的时候,串口传到PC机上的数据还是对的,但运行一段时间后,数据就不对了,比先前的大很多,大到几万,而前面正确的只在10以内,不知道是什么原因。请高手指点!下边是对串口的一些设置及串口中断函数。
//=================串口中断参数设置=============//
TMOD=0x25; //T0为计数器,T1为波特率发生器
SCON=0x50; //01000000 方式1 波特率由T1决定,REN=1允许接收
PCON=0x80; //设定波特率为2400*2=4800 ,单片机晶振为11.0592MHZ
TH1=0xf4;
TL1=0xf4; //T1作波特率发生器的初值
ES=1; //开串口中断
TR1=1; //启动波特率发生器也即定时/计数器1
//=========串口中断函数=========================
void serial() interrupt 4
{
Uchar tmp;
Uchar i;
Uchar SendN;
ES=0; //关中断
while(!RI)
{
ES=1;
TI=0;
EX0=1; //开按键中断
for(i=20;i>0;i--);
return;
}
RI=0; //清除接收中断标志
tmp=SBUF;
if(tmp==0x24) //判断是否为call
{ SBUF=0x24; //为call则回复应答信号
while(!TI); //判断TI是否为1,为1 ,则发送完毕,否则,完送未完成。
TI=0;
ES=1;
for(i=20;i>0;i--);
return;
}
else
if((tmp==0x25)&&(FlaMeasEnd==1)) //判断是否为发送数据请求标志及是否本次测量结束,如果都符合则发送数据
{
/*传送计数值*/
for(SendN=0;SendN<16;SendN++)
{
SBUF=buf[SendN];
while(!TI); //等待数据发送完毕
TI=0;
ES=1;
for(i=20;i>0;i--); //for(i=20;i>0;i--):8.3号修改
}
EX0=1; //数据发送完毕,开按键中断
FlaMeasEnd=0; //发送完数据,清除测量完毕标志
return;
}
}
|
|