Answers:
欢迎使用半双工通信系统面临的最大挑战。
RS-485不是协议,它是定义半双工(*)差分链路的电气特性的标准。规范中没有关于如何通过该链接发送数据或实际上如何使用链接的内容。
这样的RS-485收发器没有自动的“线路繁忙”信号/标志/什么,内置RS-485驱动器的微控制器也没有,也没有使用连接到外部收发器的UART内核的微控制器。
流量控制和方向控制的所有实现都取决于您使用的协议。存在几种使用RS-485驱动程序的众所周知的协议,例如Modbus。您还可以实现您能想到的任何协议。
为了帮助您,以下是一些有关协议的想法:
您有一个主从类型协议。在其中有一个主节点,它协调总线,从节点,每个节点都有一些唯一的标识符。
从节点不允许发送任何数据,直到主节点专门发送寻址到它们的命令。一旦从站被寻址,它就可以以某种预定义的方式响应任何命令,例如固定长度的响应数据包。
在这种情况下,您可以避免多个设备希望同时通话的问题,因为主机在那里可以协调所有事情。
您可以使用某种形式的调度,使总线上的每个设备都有一个固定的插槽,可以在其中将数据发送到任何其他设备。一旦其插槽用完,它必须停止发送并允许下一个设备通话。
调度可以由设备本身完成,而无需外部协调。第一台设备进行通话,然后发送一条消息,说明已完成。然后,下一个设备(例如具有下一个较高ID的设备)将知道它可以运行。如果设备没有响应,您可能会有一些超时,以便日程安排中的每个后续设备都可以说-嗯,我已经有一段时间没有从该设备收到消息了,所以该轮到我了。
(*)我相信它也使用两个差分链接定义了全双工版本。
atmega8
微控制器时,我认为这会导致设备不稳定表演
这与军队或警察的无线电通信非常相似。需要一个协议。在大多数情况下,主从是容易的。但是另一个选择是像人类一样这样做:
等等。实施起来可能非常有趣。祝好运!
这里有解决您难题的两种可能性。
我用我的设计解决了这个问题,例如:
而不是使用2针进行通信,我使用3针。在短距离内它可以工作。第三个引脚是线路繁忙指示器。该引脚从主机侧上拉。当某人(MCU或其他任何人)想要交谈时:
这是Gregory Kornblum的答案的实现。
如果不想使用modbus,可以使用开源BACnet协议栈在RS485上进行微控制器通信。本质上,它只是传递一个令牌,该令牌告诉每个设备何时可以发送,类似于令牌环拓扑和以太网。这里有几个链接可以帮助您入门:
http://www.chipkin.com/bacnet-mstp-installation-rs485-and-cables/ http://bacnet.sourceforge.net/
软件和硬件流控制都需要软件来执行握手任务。这使术语“软件流控制”有些误导。这意味着在硬件流量控制中,通信电缆中会出现其他信号线,这些信号线指示握手状态。使用软件流控制(也称为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载波侦听这样的高速网络,已对具有随机退避计时器的多路访问,冲突检测/避免进行了分析,以求随机概率通量以进行优化。