Das Auffinden der UART-Leitung ist für das Senden von Daten kostenlos

8

Ich habe mehrere Boards, die zusammen mit Rs485 kommunizieren. Sie haben ATMegaSerien-Mikrocontroller wie atmega168poder 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 ?

Ali
quelle
2
Situationen wie diese wären einer der vielen Gründe, warum RS485 zugunsten von CAN ausläuft.
Lundin
1
Sie sollten CAN-Bus verwendet haben. Jetzt müssen Sie den Busstatus der Schicht 2 verfolgen .
Jeroen3

Antworten:

22

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:

  1. 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.

  2. 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.

Tom Carpenter
quelle
Ich denke, in einem Multimaster-Setup besteht die größte Herausforderung für das OP darin, neu / wieder verbundene Stationen mit den vorhandenen zu synchronisieren, einschließlich eines möglichen Netsplits.
Janka
Danke Tom ... Ich denke, Ihre 2 vorgeschlagenen Wege führen zu einer Sache ... Master-Slave-Ansatz ... es ist ein guter Weg, wenn Sender und Empfänger über genügend Ressourcen verfügen ... während Sie einen atmega8Mikrocontroller verwenden, denke ich, dass dies zu Instabilität auf dem Gerät führt Leistung
Ali
1
Aber ich denke, wenn Sie SOF und EOF für ein Flag verwenden, um alle Boardmitglieder darüber zu informieren, dass die Leitung besetzt ist , könnte dies helfen. Sie müssen jedoch eine Zielkarten- ID eingeben , um einer speziellen Karte mitzuteilen, dass das Paket für Sie bestimmt ist . Was ist Ihre Öffnung?
Ali
@combo_ci Sie können Paketmarkierungen verwenden (z. B. ein am Anfang hinzugefügtes Byte, um SOF anzuzeigen, und ein Byte am Ende für EOF), um alle zu benachrichtigen, dass sich der Bus in der Mitte eines Frames befindet. Aber Sie müssen auch Fehler- / Timeout-Behandlung hinzufügen, um zu sagen - nun, ich habe vor ein paar Sekunden / Minuten / Jahren einen SOF bekommen, aber ich habe noch keinen EOF. Sie müssen auch einen Weg finden, um sicherzustellen, dass zwei Geräte nicht gleichzeitig versuchen zu sprechen.
Tom Carpenter
_Sie müssen auch einen Weg finden, um sicherzustellen, dass zwei Geräte nicht gleichzeitig versuchen zu sprechen. _ es ist meine Frage :) Ich denke, es gibt keinen Standardweg, um das zu finden. Vielleicht muss ich selbst impliknet
Ali
9

Es 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:

  1. Hör mal zu.
  2. Wenn jemand spricht, warte.
  3. Wenn Sie denken, dass niemand spricht, können Sie sprechen.
  4. Warten Sie auf die Bestätigung.
  5. Wenn keine Bestätigung eingegangen ist, sprechen Sie erneut.
  6. Wenn Sie senden möchten, bitten Sie alle Sender, das Hören zu bestätigen.
  7. Wenn Sie mit jemandem sprechen möchten, der Sie nicht hören kann, fragen Sie, ob es jemanden gibt, der weiterleiten kann.

Und so weiter. Kann sehr interessant zu implementieren sein. Viel Glück!

Gregory Kornblum
quelle
Dies wird auch für die Vernetzung verwendet: en.m.wikipedia.org/wiki/…
Marty
Dies ist ein guter Weg, aber Sie haben das Problem, dass, wenn (aus irgendeinem Grund) eine Karte nicht sagen kann, dass ich fertig bin, der Bus für immer ausgelastet ist ... und wenn Sie einen Timer verwenden, um zu erkennen, dass keine Belegung vorhanden ist, ein zusätzlicher Overhead für den Mikrocontroller erforderlich ist Sie haben eine Möglichkeit, dieses Problem zu lösen?
Ali
1
Es besteht auch die Möglichkeit, dass ein brutaler Junge Ihr Gerät in Stücke hämmert. Entschuldigung, ich habe nicht gesagt, dass alles lösbar ist.
Gregory Kornblum
😊 Übrigens als viel Gregory
Ali
Interessante Art, über das Problem nachzudenken, insbesondere über das Routing.
Downbeat
3

Hier sind einige Möglichkeiten, um Ihr Dilemma zu lösen.

  1. Implementieren Sie ein Token-Passing-System. Wenn ein Gerät über das Token verfügt, kann es für einen begrenzten Zeitraum senden. Anschließend wird das Token an das nächste Gerät übergeben. Es müssen Vorkehrungen für fehlende Knoten getroffen werden, die das Token nicht empfangen und weitergeben können.
  2. Schauen Sie sich die Empfangsleitung an. Wenn es beschäftigt ist, generieren Sie eine zufällige Verzögerung und versuchen Sie es erneut. Die zufällige Verzögerung stellt sicher, dass kein Knoten die Sendefenster monopolisieren kann. Es können immer noch Kollisionen auftreten, aber eine Prüfsummenfunktion kann feststellen, ob das empfangene Paket intakt ist. Wenn es nicht intakt ist, kann der Empfänger eine erneute Übertragung anfordern.
Glenn W9IQ
quelle
Für den Start Nummer 1 muss ein Token von einer Karte gesendet werden, die als Master fungiert. Auf einem einzelnen Bus erhalten alle Karten Token. Wie kann ein Token auf einer Karte gehalten werden?
Ali
@combo_ci Sie können einen Master bestimmen oder den Absender des Tokens aushandeln, indem Sie die niedrigste Busadresse oder ähnliches bestimmen.
Glenn W9IQ
@combo_ci Sie könnten versuchen, es an ein bestimmtes Gerät in der Leitung zu übergeben, eines, das Sie das Netzwerk
einrichten
2

Wie kann eine Karte feststellen, ob die UART-Leitung frei ist, Daten zu senden?

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).

und wenn es feststellt, dass der Bus besetzt ist, warten Sie, bis der Bus frei ist, und senden Sie dann seine eigenen Daten?

Der allgemeine Ansatz besteht darin, eine zufällige Zeitspanne zu warten und es erneut zu versuchen.

dannyf
quelle
2

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:

  • prüft diesen Pin-Zustand (INPUT).
  • Wenn der Pin HIGH ist, wird der Pin niedrig (OUTPUT).
  • und Gespräche.
  • Wenn die übertragene Nachricht den Pin (INPUT) (hochohmig) freigibt, wird der Pin hoch.
  • Wenn der Stift niedrig ist, wartet er einige Zeit und geht dann zurück, um den Stiftzyklus zu überprüfen.

Dies ist eine Umsetzung der Antwort von Gregory Kornblum.

Mert Gülsoy
quelle
2

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/

GroundRat
quelle
2

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.

Tony Stewart Sunnyskyguy EE75
quelle