Forum: Mikrocontroller und Digitale Elektronik Modbus RS485: Wie oft Stopp/Startbits ?


von StartStoppSchwindel (Gast)


Lesenswert?

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)

von Kunz (Gast)


Lesenswert?

Ein Byte aus acht Bits. Je Byte ein Startbit und ein Stopbit. Macht zehn 
Bit pro Byte.
So steht es oben beschrieben.

von Georg G. (df2au)


Lesenswert?

StartStoppSchwindel schrieb:
> Also wirklich jedes Byte?
Ja.

> Wie verhält es sich mit dem 16-Bit-CRC?
Das sind zwei 2 Bytes. Also: Siehe oben.

von StartStoppSchwindel (Gast)


Lesenswert?

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

von Georg G. (df2au)


Lesenswert?

Ein Stoppbit reicht aus. Mit 2 Stoppbits bist du geringfügig langsamer 
und gibst dem Empfänger etwas mehr Zeit, die Daten zu verarbeiten.

von StartStoppSchwindel (Gast)


Lesenswert?

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?

von S. Landolt (Gast)


Lesenswert?

Das Stop-'Bit' ist der Ruhezustand.

von StartStoppSchwindel (Gast)


Lesenswert?

Das Stopbit ist aber nur der Ruhepegel bei RS232. RS485 kennt doch 
Highlevel, Lowlevel und Zerolevel.

von ge-nka (Gast)


Lesenswert?

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.

von Jim M. (turboj)


Lesenswert?

StartStoppSchwindel schrieb:
> RS485 kennt doch
> Highlevel, Lowlevel und Zerolevel.

Nö. Der Bereich um 0V ist i.A. nicht definiert.

von StartStoppSchwindel (Gast)


Lesenswert?

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

von Georg (Gast)


Lesenswert?

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

von Oliver W. (pilzkopf)


Lesenswert?

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

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.