标题: 51单片机多机通信,主机如何统计出从机的数量? [打印本页]

作者: liduofu    时间: 2021-10-1 21:29
标题: 51单片机多机通信,主机如何统计出从机的数量?
我想做一个多机通信,一主机,1-225个从机,主机向从机发送地址码,从机收到,并回传给主机,主机收到如何统计出来有多少个从机在线?

作者: hhdsdy    时间: 2021-10-1 22:37
从机一开机就一直向主机发送请求,主机响应后按顺序分配从机地址(可参考I2C总线的仲裁机制);从机离线之前必须向主机发送离线信号,以便回收地址继续利用;如果担心从机突然断电浪费地址,主机可在比较空闲时或者定时发送特殊的响应信号,对于3次没有从机响应的地址加入待分配地址参与分配。
作者: 188610329    时间: 2021-10-1 23:08
做一个变量,有回复就是在线 +1 没回复就是不在线 不加,最后看变量变成几。
作者: TTQ001    时间: 2021-10-3 08:57
根据从设备的通信确认,主设备可以将连接的设备总数加1。
作者: 语.    时间: 2021-10-4 15:53
一般上线都会给主机发个信号
作者: Hephaestus    时间: 2021-10-4 16:02
发心跳,没回复就算掉线。问题是你不知道n号站对应哪个从机真的能用吗?
作者: lisanfang    时间: 2022-4-1 15:33
188610329 发表于 2021-10-1 23:08
做一个变量,有回复就是在线 +1 没回复就是不在线 不加,最后看变量变成几。

就是这样做的,说时统计不准,时多时少
作者: lisanfang    时间: 2022-4-1 15:37
Hephaestus 发表于 2021-10-4 16:02
发心跳,没回复就算掉线。问题是你不知道n号站对应哪个从机真的能用吗?

我从机有编号,从机收到就返回一个数,主机变量+1,一个周期变量清0
作者: Hephaestus    时间: 2022-4-1 17:56
lisanfang 发表于 2022-4-1 15:37
我从机有编号,从机收到就返回一个数,主机变量+1,一个周期变量清0

那么是问题已经解决了,还是你还有什么别的问题?
作者: 单片机学习习    时间: 2022-4-1 18:49
把每个从机设置一个名字,每次和主机交换数据时先发送名字,后发送数据,从机收到自己的名字时就收主机的数据进行交换
作者: liduofu    时间: 2022-4-22 22:22
188610329 发表于 2021-10-1 23:08
做一个变量,有回复就是在线 +1 没回复就是不在线 不加,最后看变量变成几。

我就是这种方法,统计不准,明明有时12个在线,显示11个   
作者: liduofu    时间: 2022-4-22 22:26
Hephaestus 发表于 2022-4-1 17:56
那么是问题已经解决了,还是你还有什么别的问题?

至今还在摸索,有时计不准不知道是什么原因,串口有时也死机了   
作者: liduofu    时间: 2022-4-22 22:46

void ZOHJI_NUM()   //============================发从机代码=0-255==========
{       
        static uchar  TX_ZHONGJI_COUT=0;//发送从机的编码
               uchar  SLAVE_COUT=0;//从机从计数//

                 //===接收到的数据等于发射的数据
             if(ZHONGJI_Dat==TX_ZHONGJI_COUT)
                   {
           ERR_SALVE_TIM=0;                //没收到开始计时          
           TX_ZHONGJI_COUT++;        //发送从机号,0-255XTD!
           SLAVE_COUT++;                //从机返回来编号0-255XDNX!收到也开始计数
                   Slave_PCS++;    //开始统计从机数量
                   }
                  
                 if(ZHONGJI_Dat!=TX_ZHONGJI_COUT)
                  
                    {
                  
                      TX_ZHONGJI_COUT;         //发从机号出去,从机没有收到,重发不变的代码TX_ZHONGJI_COUT
                      SLAVE_COUT;            //从机没有收到,重发不计数
                               
                      ERR_SALVE_TIM++;  //从机未收到超时计时
                  
                    }

                         if(ERR_SALVE_TIM==4)
                             {                                         
                              TX_ZHONGJI_COUT++;         //发从机号出去,3次从机没有到,发下一个从机代码
                                  SLAVE_COUT++;         //统计从机数量加一次。保持跟发送的代码同步
                             }
                                                  
                                 if(ERR_SALVE_TIM==7)   //如果3次从机也没有收到就结束
                             {
                              ERR_SALVE_TIM=0;                                         
                              TX_ZHONGJI_COUT=1;         //如果还没有从机返回来重新开始,表一轮结束//从1开始发
                                 
                                   SLAVE_COUT=0; //从机计数清0
                  ZHONGJI_PCS_A=Slave_PCS;//把计数发送到遥控器上显示
                  Slave_PCS=0;        //从机总计数清0                       
                         
                             }
                  
          TX_ZHONGJI_NUM[0]=TX_ZHONGJI_COUT/100+0x30;
      TX_ZHONGJI_NUM[1]=TX_ZHONGJI_COUT%100/10+0x30;
          TX_ZHONGJI_NUM[2]=TX_ZHONGJI_COUT%100%10+0x30;
          TX_ZHONGJI_NUM[3]='X';
      TX_ZHONGJI_NUM[4]='T';
          TX_ZHONGJI_NUM[5]='D';
          TX_ZHONGJI_NUM[6]='!';                 
                                 
        SendString(TX_ZHONGJI_NUM);//发代码1-255个数          
                                 
  memset(S_tab,0,sizeof(S_tab));        
                  
}       




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1