首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

小弟最近用STC单片机做RS232多机通信时发现程序运行一段时间后就不能正常通信了,程序卡在某个地方,求指导,多谢!

2012-08-29 
小弟最近用STC单片机做RS232多机通信时发现程序运行一段时间后就不能正常通信了,程序卡在某个地方,求指导,

小弟最近用STC单片机做RS232多机通信时发现程序运行一段时间后就不能正常通信了,程序卡在某个地方,求指导,谢谢!!
主机通信程序:
//------------串口2发通信函数------------------//
uchar master(uchar addr,uchar command)
{
uchar aa,i,p; 
 while(1)
{
S2BUF=addr; //发送呼叫地址
while(!(S2CON&0X02));
S2CON &=0XFD;//清除TI
while(!(S2CON&0X01));
S2CON &=0XFE;//清除RI
if(S2BUF!=addr)//若地址错,发复位信号
err();
 
else
{
S2CON&=0XF7; //清除地址标志S2TB8
S2BUF=command;//发主机控制命令
while(!(S2CON &0X02));
S2CON &=0XFD;

while(!(S2CON&0X01));
S2CON &=0XFE;
aa=S2BUF;//接收从机状态
if((aa&&0x08)==0x08)//若命令未被接收
{
S2CON|=0x08;//把S2TB置1,复位
err();
}
else
{
if(command==0x01)//是发送命令
{
if((aa&0x01)==0x01)//从机已准备好接收

do
{
p=0;//清除校验和
for (i=0;i<bn;i++)
{
S2BUF=uart2_sBuf[i]; //发送一次数据
p+=uart2_sBuf[i];

while(!(S2CON&0X02));
S2CON&=0xfd;
}  
S2BUF=p;//发送校验和
while(!(S2CON&0X02));
S2CON&=0xfd;

while(!(S2CON&0X01));
S2CON&=0xfe;
}while(S2BUF!=0);
S2CON|=0x08; //发复位信号
return(0); 
}
}
else
{
if((aa&0x02)==0x02)
{
clearRbuf(); //清除接收缓存
while(1)
{
p=0;
for(i=0;i<bn;i++)
{
while(!(S2CON&0X01));
S2CON&=0xfe;
uart2_rBuf[i]=S2BUF;
p+=uart2_rBuf[i];
}
while(!(S2CON&0X01));
S2CON&=0xfe;
if(S2BUF==p)
{
S2BUF=0X00;
while(!(S2CON&0X02));
S2CON&=0xfd;
break;
}
else
{
S2BUF=0XFF;
while(!(S2CON&0X02));
S2CON&=0xfd;
}
}
S2CON|=0x08;
return(0);

else //从机没信息要发或者出错
{
clearRbuf();
S2CON|=0x08; //发复位信号
return(0);



}
}
}

}
从机接收程序:
//------------接收中断函数-----------------//
void receive() interrupt 8 
{
uchar a; 
S2CON &=0XFE;

IE2 =0X00;//关闭中断

//清除RI
if(S2BUF!=ID)//判断是否是本机地址
{//不是本机地址,继续监听
IE2=0X01;
goto reti;
}
S2CON&=0XDF;//是本机地址,把SM2清零,接收数据
S2BUF=ID;//把本机地址发回主机校验
while(!(S2CON&0X02));
S2CON&=0XFD;

while((S2CON &0X01)!=1);
S2CON&=0XFE;
  if((S2CON&0X04)==1)//判断RB8是否为1,为1,SM2=1,继续监听
{
S2CON|=0x20;
IE2=0X01;
goto reti;
}
a=S2BUF;
if(a==0x01)//是主机发数据给从机命令
{//是否准备好接收数据
if(rready==1)
S2BUF=0X01;
else
S2BUF=0X00;
while(!(S2CON&0X02));
S2CON &= 0XFD;
//while((S2CON &0X01)!=1);
//S2CON &= 0XFE;
if((S2CON &0X04)==1)
{
S2CON|=0x20;
IE2=0X01;
goto reti;
}
sre();//接收数据
}
else

if(a==0x02)//是从机发送数据给主机命令
{
if(tready==1)
S2BUF=0x02; 
else
{
S2BUF=0X00;
S2CON|=0x20;
IE2=0X01;
goto reti;
}
while(!(S2CON &0X02));
S2CON &= 0XFD;
//while(!(S2CON &0X01));
//S2CON &= 0XFE;


if((S2CON &0X04)==1)
{
SM2|=0x20; 
IE2=0X01;
goto reti;
}  
send();
}
else //出现异常
{
S2BUF=0X80;
while((S2CON &0X02)!=1);
S2CON &= 0XFD;
S2CON|=0x20;
IE2=0X01;
}
}
reti:;
}

[解决办法]
不明白,怎么卡在一个地方?是运行不下去了?

你这个中断程序有点问题
一是尽量不要在中断中调用其他函数,例如send()
二是你在中断中多次读写S2BUF,这样很不可靠

热点排行