如何找到免费的UART线来发送数据


8

我有几个与Rs485通讯的板。他们有ATMega系列微控制器,例如atmega168patmega8。每个板卡都可以随时自由发送数据,而且我有一定的局限性,导致无法使用Modbus。板子的数量可以从5到10。

我的问题是:电路板如何找到UART线是否可以自由发送数据,并且如果它检测到总线繁忙,请等到总线空闲后再发送自己的数据?

是否有可以自动或手动更改它的特殊标志或寄存器,并让另一块板发现线路忙


2
像这样的情况将是RS485逐渐被CAN淘汰的众多原因之一。
隆丁

1
您应该使用CAN总线。现在,您必须跟踪第2层总线状态。
Jeroen3年

Answers:


22

欢迎使用半双工通信系统面临的最大挑战。

RS-485不是协议,它是定义半双工(*)差分链路的电气特性的标准。规范中没有关于如何通过该链接发送数据或实际上如何使用链接的内容。

这样的RS-485收发器没有自动的“线路繁忙”信号/标志/什么,内置RS-485驱动器的微控制器也没有,也没有使用连接到外部收发器的UART内核的微控制器。

流量控制和方向控制的所有实现都取决于您使用的协议。存在几种使用RS-485驱动程序的众所周知的协议,例如Modbus。您还可以实现您能想到的任何协议。

为了帮助您,以下是一些有关协议的想法:

  1. 您有一个主从类型协议。在其中有一个主节点,它协调总线,从节点,每个节点都有一些唯一的标识符。

    从节点不允许发送任何数据,直到主节点专门发送寻址到它们的命令。一旦从站被寻址,它就可以以某种预定义的方式响应任何命令,例如固定长度的响应数据包。

    在这种情况下,您可以避免多个设备希望同时通话的问题,因为主机在那里可以协调所有事情。

  2. 您可以使用某种形式的调度,使总线上的每个设备都有一个固定的插槽,可以在其中将数据发送到任何其他设备。一旦其插槽用完,它必须停止发送并允许下一个设备通话。

    调度可以由设备本身完成,而无需外部协调。第一台设备进行通话,然后发送一条消息,说明已完成。然后,下一个设备(例如具有下一个较高ID的设备)将知道它可以运行。如果设备没有响应,您可能会有一些超时,以便日程安排中的每个后续设备都可以说-嗯,我已经有一段时间没有从该设备收到消息了,所以该轮到我了。


(*)我相信它也使用两个差分链接定义了全双工版本。


我认为在多主站设置中,因为OP面临的最大挑战是使新/重新连接的站与现有站保持同步,包括可能的网络分割。
Janka'7

谢谢汤姆...我认为您的2种建议方法会导致1件事情... 主从方法 ...如果发送方和接收方有足够的资源,这是个好方法..使用atmega8微控制器时,我认为这会导致设备不稳定表演
阿里

1
但是我认为如果使用SOFEOF标记来通知所有董事会该线路正忙,则可能会有所帮助。但是必须在特定的板上放一个目标板ID来告诉特殊数据包“ 这是给您的”,您的打算什么?
阿里

@combo_ci,您可以使用数据包标记(例如,在开头添加一个字节来指示SOF,在EOF的末尾添加一个字节),这有助于使每个人都知道总线位于帧的中间。但是您还必须添加错误/超时处理才能说-好吧,几年前我在几秒钟/分钟/几年就获得了SOF,但是我还没有EOF。您还需要找到一种方法来确保两个设备不会尝试同时通话。
汤姆·卡彭特

_您还需要找到一种方法来确保两个设备不会尝试同时通话。_这是我的问题:)我认为没有标准的方法可以发现。也许我必须自己隐瞒
阿里(Ali)

9

这与军队或警察的无线电通信非常相似。需要一个协议。在大多数情况下,主从是容易的。但是另一个选择是像人类一样这样做:

  1. 听。
  2. 如果有人讲话,请稍候。
  3. 如果您认为没有人讲话,则可以发言。
  4. 等待确认。
  5. 如果未收到确认,请再说一次。
  6. 如果要广播,请所有电台确认收听。
  7. 如果您想与听不到您的人交谈,请询问是否还有其他人可以中继。

等等。实施起来可能非常有趣。祝好运!



这是个好方法,但是有一个问题,如果(由于某种原因)一个板子可以说我做完了,总线永远都在忙...如果使用计时器检测不忙,则会给微控制器带来额外的开销,你有办法解决这个问题吗?
阿里

1
还有一个残酷的男孩会把您的设备锤成碎片的机会。对不起,我没有说所有的东西都可以解决。
Gregory Kornblum

😊顺便说一句,格雷戈里
阿里(Ali)

考虑问题的有趣方式,尤其是路由。
令人沮丧的

3

这里有解决您难题的两种可能性。

  1. 实施令牌传递系统。当设备具有令牌时,它可以在有限的时间段内发送。然后,它将令牌传递到下一个设备。必须为无法接收和传递令牌的丢失节点做好准备。
  2. 看接收线。如果很忙,请产生随机延迟,然后重试。随机延迟有助于确保没有一个节点可以垄断传输窗口。冲突仍然可能发生,但是校验和功能可以确定接收到的数据包是否完整。如果它不是完整的,则接收方可以请求重传。

对于第一种开始方式,令牌必须从作为主控板的板发送。在单总线上,所有板都接收令牌,令牌如何固定在板上?
阿里

@combo_ci,您可以指定主控方,也可以通过确定最低的总线地址或类似地址来协商令牌的始发方。
Glenn W9IQ'7

@combo_ci,您可以尝试将其传递到线路上的特定设备,即建立网络的设备
seetharaman

2

开发板如何找到UART线是否可以自由发送数据,

普遍的回答是,如果没有某种协议,它将无法可靠地做到这一点。您通常需要依靠控制器或仲裁器来查看线路是否繁忙。一个简单的方法是,OD引脚在传输之前将指示器线拉下,然后再释放。通过读取那条线,发送器可以确定总线是否可用。

一个不太可靠但更简单的系统是集成总线电压(例如,通过ar / c网络)。

如果它检测到总线繁忙,请等到总线空闲后再发送自己的数据?

通常的方法是等待随机的时间段然后重试。


2

我用我的设计解决了这个问题,例如:

而不是使用2针进行通信,我使用3针。在短距离内它可以工作。第三个引脚是线路繁忙指示器。该引脚从主机侧上拉。当某人(MCU或其他任何人)想要交谈时:

  • 检查该引脚状态(输入)。
  • 如果引脚为高电平,则使引脚为低电平(输出)
  • 和谈。
  • 传送消息时,释放引脚(INPUT)(高阻),然后引脚变为高电平。
  • 如果引脚为低电平,则等待一段时间,然后返回以检查引脚周期。

这是Gregory Kornblum的答案的实现。



2

软件流控制

软件和硬件流控制都需要软件来执行握手任务。这使术语“软件流控制”有些误导。这意味着在硬件流量控制中,通信电缆中会出现其他信号线,这些信号线指示握手状态。使用软件流控制(也称为XON-XOFF流控制),可以使用标准通信线路将字节发送到发送方。

使用硬件流控制意味着,在发送方和接收方之间必须存在更多的线路,从而导致电缆更粗且更昂贵。因此,如果不需要软件流控制来获得最大的通信性能,则它是一个很好的选择。软件流控制利用了两个设备之间的数据通道,从而减少了带宽。在大多数情况下,带宽的减少并不令人惊讶,这是不使用带宽的原因。

在ASCII字符集中已预定义了两个字节,可与软件流控制一起使用。这些字节称为XOFF和XON,因为它们可以停止并重新开始传输。XOFF的字节值为19,可以通过按键盘上的Ctrl-S进行模拟。XON分配的值17等效于Ctrl-Q。

使用软件流控制很容易。如果必须推迟发送字符,则在线发送字符XOFF,以再次使用XON重新开始通信。发送XOFF字符只会停止在发出XOFF的设备方向上的通信。

这种方法有一些缺点。已经讨论了一个:在通信通道上使用字节占用一些带宽。另一个原因更为严重。

握手主要用于防止接收器缓冲区溢出,该缓冲区在内存中用于存储最近接收的字节。如果发生溢出,这将影响通信通道上新字符的处理方式。在最坏的情况下,如果软件设计不当,这些字符将被丢弃而不进行检查。如果这样的字符是XOFF或XON,则会严重破坏通信流程。如果XOFF丢失,发送方将连续提供新信息,或者如果未收到XON,则发送方将永远不发送新信息。

对于信号质量较差的通信线路也是如此。如果由于线路上的噪声而无法清晰地接收到XOFF或XON消息,该怎么办?还需要采取特殊的预防措施,以使发送的信息不包含XON或XOFF字符作为信息字节。

因此,仅在通信速度不太高时使用软件流控制的串行通信才可以接受,并且发生缓冲区溢出或数据损坏的可能性很小。

高速CSMA

对于像以太网CSMA载波侦听这样的高速网络,已对具有随机退避计时器的多路访问,冲突检测/避免进行了分析,以求随机概率通量以进行优化。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.