您现在的位置: 爱51代码网 >> 范文 >> 文章正文
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:;
} 提一点建议:
屏蔽其他地方,用单片机和串口助手调试,先实现一个字符的发送,确保正确后,循环发送字符就是字符串了。如果字符串发送也成功,证明串口发送正确。

反过来串口助手发数据,单片机接收,如果正确,说明接收也是OK的。

如果项目还有问题,找其他的逻辑、数据处理部分吧

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    GIS用百度行政区域的经纬度直接画
    不小心卸载了.net 4 extend,vs2
    C#byte【】里的数转换成string时
    C#的session取不到值
    java如何判断一个字符串里的数字
    随机找出24个不一样的字,在把一
    java怎么实现html转为pdf
    lotus数据列表文档个数如何实时统
    lotus代理中LS如何将字符串保存到
    在lotus BS系统里怎样方便实现统
    GIS用百度行政区域的经纬度直接画
    不小心卸载了.net 4 extend,vs2
    C#byte【】里的数转换成string时
    C#的session取不到值
    java如何判断一个字符串里的数字
    java怎么实现html转为pdf
    lotus数据列表文档个数如何实时统
    在lotus BS系统里怎样方便实现统
    undefined reference timer_crea
    linux文件/usr/lib破坏了,还原后
    STC单片机做RS232多机通信运
    modbus模拟器寄存器读取错误
    BUILD: corrupt database (D
    WinCE 7自带IE浏览器网页显示
    Directsound如何控制声卡左右
    如何将opencv2.0完整移植到W
    编译./arm_qt4.5_build不成功
    mini2440开发板发送at指令没
    不同CAN控制器之间能组成CAN
    UART驱动对外提供的接口是什
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |