Ich habe mehrere Boards, die zusammen mit Rs485 kommunizieren. Sie haben ATMega
Serien-Mikrocontroller wie atmega168p
oder atmega8
. Jede Karte kann jederzeit Daten senden, und ich habe Einschränkungen, die dazu führen, dass ich Modbus nicht verwenden kann . Die Anzahl der Karten kann zwischen 5 und 10 liegen.
Mein Problem ist: Wie kann eine Karte feststellen, ob die UART-Leitung frei ist, um Daten zu senden, und wenn sie feststellt, dass der Bus besetzt ist, warten Sie, bis der Bus frei ist, und senden Sie dann eigene Daten?
Gibt es ein spezielles Flag oder Register, das es automatisch oder manuell ändern und die andere Karte feststellen lassen könnte, dass die Leitung besetzt ist ?
Antworten:
Willkommen bei der größten Herausforderung mit Halbduplex-Kommunikationssystemen.
RS-485 ist kein Protokoll, sondern ein Standard, der die elektrischen Eigenschaften einer Halbduplex-Differentialverbindung (*) definiert. In der Spezifikation ist nichts darüber enthalten, wie Daten über diesen Link gesendet werden sollen oder wie der Link tatsächlich verwendet wird.
Als solche haben RS-485-Transceiver weder ein automatisches Signal / Flag / was auch immer "Leitung ist besetzt", noch Mikrocontroller, die RS-485-Treiber eingebaut haben, noch solche, die einen UART-Kern verwenden, der an einen externen Transceiver angeschlossen ist.
Die gesamte Implementierung der Fluss- und Richtungssteuerung bleibt dem von Ihnen verwendeten Protokoll überlassen. Es gibt mehrere bekannte Protokolle, die RS-485-Treiber verwenden, wie z. B. Modbus. Sie können auch jedes erdenkliche Protokoll implementieren.
Um Ihnen dabei zu helfen, sind dies einige Ideen für Protokolle:
Sie haben ein Master-Slave-Protokoll. In diesem gibt es einen Masterknoten, der den Bus koordiniert, und Slaveknoten, die jeweils eine eindeutige Kennung haben.
Die Slave-Knoten dürfen keine Daten senden, bis der Master-Knoten speziell an sie adressierte Befehle sendet. Sobald ein Slave angesprochen wurde, kann er auf eine vordefinierte Weise auf jeden Befehl reagieren - beispielsweise auf ein Antwortpaket mit fester Länge.
In diesem Fall vermeiden Sie Probleme mit mehreren Geräten, die gleichzeitig sprechen möchten, da der Master für die Koordinierung zuständig ist.
Sie können eine Form der Zeitplanung verwenden, bei der jedes Gerät am Bus über einen festen Steckplatz verfügt, in dem Daten an ein anderes Gerät gesendet werden können. Sobald der Steckplatz leer ist, muss er aufhören zu senden und das nächste Gerät sprechen lassen.
Die Planung könnte von den Geräten selbst ohne externe Koordination durchgeführt werden. Das erste Gerät spricht und sendet dann eine Nachricht, dass dies erledigt ist. Das nächste Gerät (z. B. das mit der nächsthöheren ID) würde dann wissen, dass es gehen könnte. Falls ein Gerät nicht reagiert, kann es zu einer Zeitüberschreitung kommen, in der jedes nachfolgende Gerät im Zeitplan sagen kann - nun, ich habe eine Weile nichts mehr von dem Gerät gehört, also muss ich an der Reihe sein.
(*) Ich glaube, es definiert auch eine Vollduplex-Version mit zwei Differentialverbindungen.
quelle
atmega8
Mikrocontroller verwenden, denke ich, dass dies zu Instabilität auf dem Gerät führt LeistungEs ist der Funkkommunikation des Militärs oder der Polizei sehr ähnlich. Ein Protokoll ist erforderlich. Master Slave ist in den meisten Fällen einfach und gut. Eine andere Möglichkeit besteht darin, es wie Menschen zu tun:
Und so weiter. Kann sehr interessant zu implementieren sein. Viel Glück!
quelle
Hier sind einige Möglichkeiten, um Ihr Dilemma zu lösen.
quelle
Die allgemeine Antwort lautet, dass dies ohne ein Protokoll nicht zuverlässig möglich ist. Normalerweise verlassen Sie sich auf einen Controller oder Schiedsrichter, um festzustellen, ob eine Leitung besetzt ist oder nicht. Ein einfacher wäre ein OD-Stift, der eine Anzeigeleitung vor dem Senden nach unten zieht und danach wieder loslässt. Durch Lesen dieser Zeile kann ein Sender feststellen, ob der Bus verfügbar ist oder nicht.
Ein weniger zuverlässiges, aber einfacheres System ist die Integration der Busspannung (z. B. über ein Ar / C-Netzwerk).
Der allgemeine Ansatz besteht darin, eine zufällige Zeitspanne zu warten und es erneut zu versuchen.
quelle
Ich löse dieses Problem mit meinen Entwürfen wie folgt:
Stattdessen benutze ich 2 Pins für die Kommunikation und 3 Pins. Innerhalb kurzer Entfernungen funktioniert es. Der 3. Pin ist die Leitungsbelegungsanzeige. Dieser Stift wird von der Masterseite nach oben gezogen. Wenn jemand (MCU oder was auch immer) sprechen möchte:
Dies ist eine Umsetzung der Antwort von Gregory Kornblum.
quelle
Sie können den Open-Source-BACnet-Protokollstapel für die Mikrocontroller-Kommunikation auf RS485 verwenden, wenn Sie keinen Modbus verwenden möchten. Im Wesentlichen wird nur ein Token übergeben, das jedem Gerät mitteilt, wann es senden kann, ähnlich wie bei der Token-Ring-Topologie und dem Ethernet. Hier sind ein paar Links, um Ihnen den Einstieg zu erleichtern:
http://www.chipkin.com/bacnet-mstp-installation-rs485-and-cables/ http://bacnet.sourceforge.net/
quelle
Software-Flusskontrolle
Sowohl die Software- als auch die Hardware-Flusskontrolle benötigen Software, um die Handshake-Aufgabe auszuführen. Dies macht den Begriff Software-Flusskontrolle etwas irreführend. Gemeint ist, dass bei der Hardware-Flusskontrolle zusätzliche Leitungen im Kommunikationskabel vorhanden sind, die Handshake-Bedingungen signalisieren. Bei der Software-Flusskontrolle, die auch unter dem Namen XON-XOFF-Flusskontrolle bekannt ist, werden Bytes über die Standardkommunikationsleitungen an den Absender gesendet.
Die Verwendung der Hardware-Flusskontrolle bedeutet, dass zwischen Sender und Empfänger mehr Leitungen vorhanden sein müssen, was zu einem dickeren und teureren Kabel führt. Daher ist die Software-Flusskontrolle eine gute Alternative, wenn sie nicht benötigt wird, um maximale Kommunikationsleistung zu erzielen. Die Software-Flusskontrolle nutzt den Datenkanal zwischen den beiden Geräten, wodurch die Bandbreite reduziert wird. Die Reduzierung der Bandbreite ist in den meisten Fällen jedoch nicht so erstaunlich, dass es ein Grund ist, sie nicht zu verwenden.
Im ASCII-Zeichensatz wurden zwei Bytes für die Software-Flusskontrolle vordefiniert. Diese Bytes heißen XOFF und XON, da sie die Übertragung stoppen und neu starten können. Der Bytewert von XOFF ist 19. Er kann durch Drücken von Strg-S auf der Tastatur simuliert werden. XON ist der Wert 17 zugewiesen, der Strg-Q entspricht.
Die Verwendung der Software-Flusskontrolle ist einfach. Wenn das Senden von Zeichen verschoben werden muss, wird das Zeichen XOFF in der Leitung gesendet, um die Kommunikation erneut zu starten. XON wird verwendet. Durch das Senden des XOFF-Zeichens wird die Kommunikation nur in Richtung des Geräts gestoppt, das das XOFF ausgegeben hat.
Diese Methode hat einige Nachteile. Eines ist bereits besprochen: Die Verwendung von Bytes auf dem Kommunikationskanal beansprucht etwas Bandbreite. Ein weiterer Grund ist schwerwiegender.
Handshake wird meistens verwendet, um ein Überlaufen des Empfängerpuffers zu verhindern, des Puffers im Speicher, der zum Speichern der kürzlich empfangenen Bytes verwendet wird. Wenn ein Überlauf auftritt, wirkt sich dies auf die Art und Weise aus, wie neue Zeichen auf dem Kommunikationskanal behandelt werden. Im schlimmsten Fall, wenn die Software schlecht entwickelt wurde, werden diese Zeichen weggeworfen, ohne sie zu überprüfen. Wenn ein solches Zeichen XOFF oder XON ist, kann der Kommunikationsfluss stark beschädigt werden. Der Absender liefert ständig neue Informationen, wenn der XOFF verloren geht, oder sendet niemals neue Informationen, wenn kein XON empfangen wurde.
Dies gilt auch für Kommunikationsleitungen, bei denen die Signalqualität schlecht ist. Was passiert, wenn die XOFF- oder XON-Nachricht aufgrund von Leitungsrauschen nicht eindeutig empfangen wird? Besondere Vorsichtsmaßnahmen sind auch erforderlich, damit die gesendeten Informationen nicht die XON- oder XOFF-Zeichen als Informationsbytes enthalten.
Daher ist eine serielle Kommunikation unter Verwendung der Softwareflusssteuerung nur akzeptabel, wenn die Kommunikationsgeschwindigkeiten nicht zu hoch sind und die Wahrscheinlichkeit, dass Pufferüberläufe oder Datenschäden auftreten, minimal ist.
Hochgeschwindigkeits-CSMA
Für hohe Geschwindigkeiten wie Ethernet CSMA Carrier Sense wurden Mehrfachzugriff, Kollisionserkennung / -vermeidung mit zufälligen Backoff-Timern zur Optimierung auf stochastischen Wahrscheinlichkeits-Thruput analysiert.
quelle