Ich werd aus den offiziellen Modbus-Protokollen nicht schlau. Wie muss
ich die Stopp/Startbit setzen? Alle 8-Bit oder nur einmal um die gesamte
Nachricht drumherum?
Hier (http://www.simplymodbus.ca/ASCII.htm) steht beispielsweise:
"In Modbus RTU each byte is sent as a string of 8 binary characters
framed with a start bit, and a stop bit, making each byte 10 bits."
Also wirklich jedes Byte? Wie verhält es sich mit dem 16-Bit-CRC?
Anbenommen ich habe folgende Nachricht:
H=Haltebit (Stoppbit)
S=Startbit
Da ich no-Parity hab zwei Haltebits!?
Sieht meine Nachricht also so aus?:
S-[Byte1:Functioncode:8Bit]-HH-S-[Byte2:Adress:8Bit]-HH-S-[Byte3:DATA:8B
it]-HH-S-[Byte4:CRC_LSB:8Bit]-HH-S-[Byte5:CRC_MSB:8Bit]-HH
(CRC muss ja getauscht werden MSB<->LSB)
Danke für die schnelle Antwort. Allerdings müssten es trotzdem 2
Stoppbit sein pro Byte oder? In anderen Quellen liest man davon:
http://www.camillebauer.com/src/download/Modbus_Grundlagen.pdf
"Zeichenformat: Normalerweise programmierbar
1 Start-, 8 Daten-, 1 Stopbit, even parity
1 Start-, 8 Daten-, 1 Stopbit, odd parity
1 Start-, 8 Daten-, 2 Stopbit, no parity "
Ich hab wie gesagt bei meinem Gerät "no parity".
Vielen Dank!
Hätte ich nicht gedacht, dass ich das eine Bit auch weglassen kann.
Woher weiss das Gerät denn, dass ich nur ein Bit anstatt zwei verwende
und das nächste Bit nicht schon zum nächsten Nachrichten-Byte gehört?
StartStoppSchwindel schrieb:> Woher weiss das Gerät denn, dass ich nur ein Bit anstatt zwei verwende> und das nächste Bit nicht schon zum nächsten Nachrichten-Byte gehört?
In dem du beiden Geräten die sich unterhalten sollen das erzählst.
also:
Baudrate bei beiden gleich und
1 Start-, 8 Daten-, 1 Stopbit, even parity
oder
1 Start-, 8 Daten-, 1 Stopbit, odd parity
oder
1 Start-, 8 Daten-, 2 Stopbit, no parity
auch bei beiden gleich, sonst können sie sich gar nicht verstehen.
Ok, hab mich vielleicht etwas sehr doof ausgedrückt.
Hab in der englischen wiki das Bildchen gefunden:
http://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/RS-485_waveform.svg/487px-RS-485_waveform.svg.png
Ich denke das ich daraus folgendes ablese:
- Der Idle-Zustand ist der Ruhezustand, den ich für RS485 RTU brauche.
Dieser Zustand muss auch 3,5 Character lang sein zwischen den
Nachrichten.
- Start und Stoppbits haben umgekehrte Polarität (Und sind nicht der
Ruhezustand)
- das niederwertigste Bit wird zuerst gesendet
StartStoppSchwindel schrieb:> - Start und Stoppbits haben umgekehrte Polarität (Und sind nicht der> Ruhezustand)
Ist dir noch nicht aufgefallen, dass Start- und Stop-Bit VERSCHIEDENE
Polarität haben? Stop-Bit = Ruhezustand, und der kann 1 bit, 2 bit oder
auch unendlich lang sein - bis zum nächsten Startbit eben.
Georg
StartStoppSchwindel schrieb:> Ok, hab mich vielleicht etwas sehr doof ausgedrückt.>> Hab in der englischen wiki das Bildchen gefunden:> http://upload.wikimedia.org/wikipedia/commons/thum...>> Ich denke das ich daraus folgendes ablese:>> - Der Idle-Zustand ist der Ruhezustand, den ich für RS485 RTU brauche.> Dieser Zustand muss auch 3,5 Character lang sein zwischen den> Nachrichten.>> - Start und Stoppbits haben umgekehrte Polarität (Und sind nicht der> Ruhezustand)>> - das niederwertigste Bit wird zuerst gesendet
Nein, der Ruhezustand ist der Stop-Pegel. Guck dir mal das Datenblatt
typische RS485 Empfänger an, oft ist der Bereich von -0,3V - -0,02V
nicht definiert, dh der Ausgang spinnt da zT sogar.
Darum verwendet man oft FailSave Terminierungen, z.Bsp:
0V |--- 750Ohm --- A --- 100Ohm --- B --- 750Ohm ---> 5V
So wird der Bus im Idle auf einen Definierten Pegel gezogen.
Einige Empfänger nutzen aber auch Hysteresen über diesen Bereich, oft
bezeichnet als FailSave RS485.
Den Ruhezustand sieht der IC hinter dem Transceiver also garnicht, er
sollte da ein dauerhaften "Stop", dh ein A > B sehen.
Das Start ist dann ein A < B, danach 8 Datenbits, dann Parity und als
Stop 2 Bit mit A > B. Danach darf wieder die Flanke zum Stop kommen.
Zur Erkennung zB beim ATMega (Zitat aus irgendeiner Ausarbeitung von
mir):
Mikrocontroller der AVR-Familie wie der im Versuchsaufbau genutzte
AT90USB162 tasten das Signal am RX-Eingang mit dem 16fachen der Baudrate
ab, nutzen allerdings nur wenige der aufgenommenen Samples. Bei anderen
Controllern kann dies gegebenenfalls abweichen und ist entsprechend zu
beachten.
Befindet sich die Empfangseinheit im Leerlauf, wartet sie auf die erste
negative Flanke. Diese wird als Beginn eines Startbits interpretiert. Um
zu prüfen ob das erkannte Startbit gültig ist, werden die drei Samples
in der Mitte des Startbits überprüft, sind zwei der drei Samples logisch
0, so ist das Startbit gültig, andernfalls wird es als Fehler verworfen.
Bei gültigem Startbit werden immer die drei mittleren Samples eines Bits
ausgewertet und bei Mehrheit von logisch 0 als 0, bei Mehrheit von
logisch 1 entsprechend als 1 gewertet.
Nach: Datenblatt AT90USB162, 17.7 Asynchronous Data Reception