这个问题与微控制器编程有关,但任何人都可以提出一个很好的算法来处理这种情况。
我有一个中央控制台和一组远程传感器。中央控制台有一个接收器,每个传感器都有一个相同频率的发射器。所以我们只能实现Simplex通信。
由于发射器的工作频率相同,我们不能同时将2个传感器发送到中央控制台。
现在我想对传感器进行编程以执行一些“轮询”。中央控制台应该了解传感器的存在(每个传感器是否响应)
我可以想象几种方式。
在每个传感器的轮询消息之间使用相同的间隔,并随机启动传感器。所以他们不会同时传播。
使用一些圆机制。传感器1开始以5秒的秒数进行轮询,第二步为10秒等。方法1的更正式版本。
最大数据传输速率约为4800 bps,因此我们也需要考虑这一点。
有人可以想象一种通过减少通信链接使用来解决这个问题的好方法。请注意,如有必要,我们可以为每个传感器使用不同的轮询间隔。
答案 0 :(得分:1)
我认为你所描述的是传感器和中央单元连接到一次只能传送一条信息的总线。
处理此问题的常用方法是进行碰撞检测。这是例如据我所知,以太网如何运作。你试着发一条消息;然后尝试检测碰撞。如果您发现了碰撞,请等待一个随机数量(打破关系)然后重新发送,当然再次进行碰撞检查。
如果无法检测到碰撞,则不同的传感器可能具有轮询间隔,这些轮询间隔都是不同的素数。这将保证每个传感器都有专用的插槽用于成功轮询。当然还会有碰撞,但不需要检测它们。这里有素数5,7和11的例子:
----|----|----|----|----|----|----|----| (5)
------|------|------|------|------|----- (7)
----------|----------|----------|-:----- (11)
* COLLISION
值得注意的是,如果传感器“同相”或“异相”,则无关紧要。
答案 1 :(得分:0)
我认为你需要研究碰撞检测系统(以太网)。如果你有基于时间的同步,你依赖控制台上的时钟和传感器永远不会失去同步。如果它们连接到外部可靠的时间参考,或者您需要在每个参考上支付电池支持的RTC(昂贵),这可能没问题。
答案 2 :(得分:0)
考虑使用全部或部分现有协议,除非协议设计本身就是目的 - 除了节省时间之外,您还可以降低协议具有导致罕见不可重现错误的竞争条件的可能性。
针对这种情况的许多协议都让传感器保持安静,直到主人特别要求他们获得当前值。这样可以很容易地避免冲突,并且如果主机认为它丢失了数据包,或者如果它更感兴趣与一个传感器保持同步而不是其他传感器,则主机很容易请求重传。这甚至可以提供比基于碰撞检测的系统更好的性能,特别是如果来自主设备的命令比传感器响应短得多。如果你最终得到像Alohanet这样的东西(见http://en.wikipedia.org/wiki/ALOHAnet#The_ALOHA_protocol),你会发现在不经常发送和有太多碰撞之间的权衡会迫使你使用不到50%的可用带宽。
答案 3 :(得分:0)
是否可以为每个传感器分配一个唯一的地址?
在这种情况下,您可以实现主/从协议(如Modbus或类似协议),所有设备共享相同的通信链接:
答案 4 :(得分:0)
几年前我和一些Zigbee系统合作过。它只有两个传感器,所以我们只是用不同的等待时间对它们进行硬编码,让它们始终响应请求。但是,由于Zigbee有系统但是,我们考虑了这个问题:
首先从控制台发布公告'嘿大家,让我们建立一个网络!' 节点都尝试用“我是硬件地址x”之类的东西做出响应,我可以加入吗? 起初它很疯狂,但随着一些随机重试时间,最终控制台响应所有节点:'是硬件地址x,你可以加入。您是节点#y,从收到数据请求开始,您将有z毫秒的等待时间
然后应该很容易。每次控制台请求数据时,节点都会轮流响应。假设所有数据的传输花费的时间少于您设置的轮询周期。最好不要承认这些消息。如果控制台无法响应,则很可能该节点将尝试在另一个节点尝试发送数据时重新传输,从而弄乱它们。然后它滚雪球完全失败......