4

这个问题与微控制器编程有关,但任何人都可以提出一个很好的算法来处理这种情况。

我有一个中央控制台和一组远程传感器。中央控制台有一个接收器,每个传感器都有一个发射器以相同的频率工作。所以我们只能实现Simplex通信。

由于发射器以相同的频率工作,我们不能让 2 个传感器同时向中央控制台发送数据。

现在我想对传感器进行编程以执行一些“轮询”。中央控制台应该对传感器的存在有所了解(每个传感器是否响应)

我可以想象几种方法。

  1. 在每个传感器的轮询消息之间使用相同的间隔并随机启动传感器。所以它们不会同时传输。

  2. 使用一些圆形机制。传感器 1 在 5 秒开始轮询,然后在 10 秒开始轮询,以此类推。方法 1 的更正式版本。

最大数据传输速率约为 4800 bps,因此我们也需要考虑这一点。

有人能想象一种用更少的通信链接来解决这个问题的好方法吗?请注意,如有必要,我们可以为每个传感器使用不同的轮询间隔。

4

5 回答 5

1

我假设您描述的是传感器和中央单元连接到一次只能传递一条消息的总线。

处理此问题的正常方法是进行碰撞检测。据我所知,这就是以太网的运行方式。您尝试发送消息;然后尝试检测碰撞。如果您检测到碰撞,请等待随机数量(打破平局)然后重新传输,当然还要再次进行碰撞检查。

如果您无法检测到冲突,则不同传感器的轮询间隔可能都是不同的素数。这将保证每个传感器都有用于成功轮询的专用插槽。当然仍然会有碰撞,但它们不需要被检测到。这里以素数 5、7 和 11 为例:

 ----|----|----|----|----|----|----|----| (5)
 ------|------|------|------|------|----- (7)
 ----------|----------|----------|-:----- (11)
                                   * COLLISION

值得注意的是,传感器启动是“同相”还是“异相”都没有关系。

于 2010-01-04T06:52:10.417 回答
0

Is it possible to assign a unique address to each sensor?

In that case you can implement a Master/Slave protocol (like Modbus or similar), with all devices sharing the same communication link:

  1. Master is the only device which can initiate communication. It can poll each sensor separately (one by one), by broadcasting its address to all slaves.
  2. Only the slave device which was addressed will reply.
  3. If there is no response after a certain period of time (timeout), device is not available and Master can poll the next device.

See also: List of automation protocols

于 2010-01-05T13:35:48.343 回答
0

考虑使用现有协议的全部或部分,除非协议设计本身就是目的 - 除了节省时间之外,您还可以降低协议出现竞争条件导致罕见的不可重现错误的可能性。

对于这种情况,许多协议都让传感器保持安静,直到主设备专门向它们询问当前值。这样可以很容易地避免冲突,并且如果主设备认为它丢失了一个数据包,或者如果它对与一个传感器保持同步而不是与其他传感器保持同步更感兴趣,它可以很容易地请求重新传输。与基于碰撞检测的系统相比,这甚至可以为您提供更好的性能,尤其是如果来自主站的命令比传感器响应短得多。如果您最终使用 Alohanet 之类的东西(请参阅http://en.wikipedia.org/wiki/ALOHAnet#The_ALOHA_protocol),您会发现不经常传输和有太多冲突之间的权衡迫使您使用不到 50%的可用带宽。

于 2010-01-04T19:31:58.707 回答
0

我认为您需要研究碰撞检测系统(例如以太网)。如果您有基于时间的同步,您可以依靠控制台上的时钟和传感器永远不会失去同步。如果它们连接到外部可靠的时间参考,或者如果您花费在每个上都配备电池支持的 RTC(昂贵),这可能没问题。

于 2010-01-04T06:52:36.327 回答
0

几年前我使用过一些 Zigbee 系统。它只有两个传感器,所以我们只是用不同的等待时间对它们进行硬编码,并让它们始终响应请求。但是由于 Zigbee 有系统但是,我们考虑了一些类似的事情:

从控制台的公告开始“大家好,让我们建立一个网络!” 节点都试图用类似“我是硬件地址 x,我可以加入吗?”之类的东西来响应。起初它很疯狂,但随着一些随机重试次数,最终控制台响应所有节点:'是的硬件地址 x,你可以加入。您是节点#y,从收到数据请求开始,您将等待 z 毫秒

那么它应该很容易。每次控制台请求数据时,节点都会轮流响应。假设传输所有数据所需的时间少于您设置的轮询周期。最好不要确认这些消息。如果控制台没有响应,那么该节点很可能会在另一个节点尝试发送数据时尝试重新传输,从而将它们都搞砸了。然后它滚雪球完全失败......

于 2010-01-05T15:22:53.657 回答