我有几个与 Rs485 通信的板。他们有ATMega
系列微控制器,例如atmega168p
或atmega8
。每块板都可以随时自由发送数据,我有限制导致我不能使用 Modbus。板的数量可以从 5 到 10 不等。
我的问题是:板子如何发现UART线是否有空发送数据,如果检测到总线忙,等到总线空闲后再发送自己的数据?
是否有特殊的标志或寄存器可以自动或手动更改它并让其他板发现线路忙?
我有几个与 Rs485 通信的板。他们有ATMega
系列微控制器,例如atmega168p
或atmega8
。每块板都可以随时自由发送数据,我有限制导致我不能使用 Modbus。板的数量可以从 5 到 10 不等。
我的问题是:板子如何发现UART线是否有空发送数据,如果检测到总线忙,等到总线空闲后再发送自己的数据?
是否有特殊的标志或寄存器可以自动或手动更改它并让其他板发现线路忙?
欢迎迎接半双工通信系统的最大挑战。
RS-485 不是协议,它是定义半双工 (*) 差分链路的电气特性的标准。规范中没有关于如何通过该链接发送数据,或者实际上如何使用该链接。
因此,RS-485 收发器没有自动“线路忙”信号/标志/任何东西,内置 RS-485 驱动程序的微控制器也没有,也没有使用连接到外部收发器的 UART 内核的微控制器。
流量控制和方向控制的所有实现都留给您使用的任何协议。存在几种使用 RS-485 驱动程序的众所周知的协议,例如 Modbus。你也可以实现你能想到的任何协议。
为了帮助您,以下是一些关于协议的想法:
你有一个主从类型的协议。其中有一个协调总线的主节点和每个都有一些唯一标识符的从节点。
在主节点专门发送寻址到它们的命令之前,不允许从节点发送任何数据。一旦从机被寻址,它就可以以某种预定义的方式响应任何命令——比如一个固定长度的响应包。
在这种情况下,您可以避免多个设备同时通话的问题,因为主设备在那里协调一切。
您可以使用某种形式的调度,总线上的每个设备都有一个固定的插槽,用于将数据发送到任何其他设备。一旦其插槽用完,它必须停止发送并允许下一个设备通话。
调度可以由设备本身完成,无需外部协调。第一个设备说话,然后发送一条消息说它完成了。下一个设备(例如,具有下一个更高 ID 的设备)会知道它可以运行。如果设备没有响应,您可能会有一些超时,因此时间表中的每个后续设备都可以说 - 我有一段时间没有收到我之前的设备的消息,所以必须轮到我了。
(*) 我相信它还定义了使用两个差分链路的全双工版本。
这与军队或警察的无线电通信非常相似。需要协议。在大多数情况下,主从很容易而且很好。但另一种选择是像人类一样做:
等等。实施起来可能非常有趣。祝你好运!
以下是解决您困境的几种可能性。
板子如何找到UART线是否可以自由发送数据,
一般的答案是,如果没有某种协议,它就无法可靠地做到这一点。您通常依靠控制器或仲裁员来查看线路是否占线。一个简单的方法是 OD 引脚在传输之前将指示线拉下并在之后释放它。通过读取该行,发送器可以确定总线是否可用。
一个不太可靠但更简单的系统是集成总线电压(例如通过 ar/c 网络)。
如果它检测到总线忙,等到总线空闲后再发送自己的数据?
一般的做法是等待一段随机时间然后重试。