c/c++ 51 单片机 串口 硬件
ucharmaster(ucharaddr,ucharcommand){ucharaa,p;while(1){SBUF=SLAVE;//发送呼叫地址while(TI!=1...
uchar master(uchar addr,uchar command)
{
uchar aa,p;
while(1)
{
SBUF = SLAVE; //发送呼叫地址
while(TI!=1)
TI=0;
while(RI!=1)
RI=0;
if(SBUF!=addr) //若地址发错,发复位信号
err();
else
{
TB8=0; //如地址相符,清地址标志
SBUF=command; //发命令
while(TI!=1)
TI=0;
while(RI!=1)
RI=0;
aa=SBUF; //接收状态
if((aa&ox08)==ox08) //*********若命令未被接受,发复位信号 ***************
{
TB8=1;
err();
}
else
...............
以上是多机通讯主机上的代码。
}
}
}
问题:以上标注有*********的地方有疑惑。程序中可以看出此时主机找到了从机,从机也给主机回应了自己的地址,当主机给从机发命令的时候怎样判断从机有没有接收到主机发来的命令?也就是说当从机接收到主机发来的命令时候会给主机怎样的回应,如果没有接收到主机发来的命令为什么可以用(aa&OX08==ox08)来作为判断?aa里面到底是什么? 展开
{
uchar aa,p;
while(1)
{
SBUF = SLAVE; //发送呼叫地址
while(TI!=1)
TI=0;
while(RI!=1)
RI=0;
if(SBUF!=addr) //若地址发错,发复位信号
err();
else
{
TB8=0; //如地址相符,清地址标志
SBUF=command; //发命令
while(TI!=1)
TI=0;
while(RI!=1)
RI=0;
aa=SBUF; //接收状态
if((aa&ox08)==ox08) //*********若命令未被接受,发复位信号 ***************
{
TB8=1;
err();
}
else
...............
以上是多机通讯主机上的代码。
}
}
}
问题:以上标注有*********的地方有疑惑。程序中可以看出此时主机找到了从机,从机也给主机回应了自己的地址,当主机给从机发命令的时候怎样判断从机有没有接收到主机发来的命令?也就是说当从机接收到主机发来的命令时候会给主机怎样的回应,如果没有接收到主机发来的命令为什么可以用(aa&OX08==ox08)来作为判断?aa里面到底是什么? 展开
展开全部
这是数据通讯常用的一种方式,按照初学者理解,两个单片机进行数据通讯,直接发送数据就可以了,比如发送15这个数,就直接发送15就行了,但是在项目中一般会在数据前面加个标志位。比如你这里0x08,告诉单片机我要发送数据给你,起到防止无效的单片机收到数据,一般还有个校验位,这里出现没看到,就不讲了。这样做就是因为串口收发数据的时候,不稳定,常常出现多数据,和少数据。实际上不对0x008处理都可以,直接发数据过来
追问
首先,非常感谢你的热心回答。其实我想知道的是我注释部分的aa是什么,为什么可以用aa&ox08来判断命令是否被接受。如果aa是从主机发送过来的消息,aa&ox08实际取值为aa从低字节起的第四位。(ox08的二进制为1000)好像没从程序中能看出aa的第四位位标志位啊
追答
if((aa&ox08)==ox08) //*********若命令未被接受,发复位信号 ***************
{
TB8=1;
err();
}
因为是部分程序不能肯定为什么要用这个位,下面考虑的可能,
从注释上面的解释是收到不合法的命令,就发送复位,这里可能是从机收到主机的命令信号,后给出的命令应答,相当于确定一个握手的关系。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询