|
发表于 2021-10-13 16:58:37
|
显示全部楼层
如果主机数量比较少,可以在设备上电的时候先协商出一个主机,让这个主机去轮询其他主机比较稳妥。
假设有32个主机 波特率9600,8,N,1。一秒传输960字节数据。默认每个主机分配10ms数据发送时间,如果采用空闲中断触发接收,理论上10ms可以发送8字节数据。设计上采用叫地主的方式。32个主机分别分配1~32地址。
假设协议2个字节:命令+主机地址。
1.主机上电时,如果100ms内没有接收到数据,进入叫地主环节。叫地主命令为00。
2.主机1在第一个10ms发送00 01。其他主机根据收到的叫地主里面的地址A信息和自身地址信息B,等待(B-A)*10ms的时间后叫地主,
如果没有前置主机那么A=0, 每个主机在叫地主期间需要记录主机的地址信息。叫地主以地址低优先。
3.主机在叫地主完成后,进入抢地主环节,为了防止不同主机开机速度不一导致未能在叫地主阶段及时发送自身地址。在最后一个主机发送或者延迟时间到了以后,进行第二轮的叫地主环节.重复2的过程
4.主机在成为地主后,依次轮询[命令01]叫地主期间记录到的各个主机:01+农民地址。其他农民主机在自己要出牌的时候发送数据,没有数据的时候就发送一个默认的ACK【命令AA】: AA+农民地址
地主在接收到农民主机的响应后轮询下一个主机。如果100ms内没有响应,也轮询下一个农民
5.为了在通信过程中对设备卸载和加载,可以在设定轮询农民8次不在线就把该农民剔除,不轮询。如果地主掉线,100ms内其他设备将接收不到信息,重复2、3的过程。
如果有新的主机加入,我们设定一个时间,比如5分钟,地主在运行5分钟以后洗牌,发送FF FF,重新进行2,3的过程。
如果新的主机是一个个挂载,那么可以在地主轮询地址最后加入轮询命令01+地址FF,新的主机在接收到这个地址后进行响应,地主根据响应的地址来进行添加到轮询列表还是直接发送FF FF进行2、3过程
2、3过程根据主机数量,基本上可以在1~3s内完成
|
评分
-
查看全部评分
|