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)
Ein Byte aus acht Bits. Je Byte ein Startbit und ein Stopbit. Macht zehn Bit pro Byte. So steht es oben beschrieben.
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.
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".
Ein Stoppbit reicht aus. Mit 2 Stoppbits bist du geringfügig langsamer und gibst dem Empfänger etwas mehr Zeit, die Daten zu verarbeiten.
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?
Das Stopbit ist aber nur der Ruhepegel bei RS232. RS485 kennt doch Highlevel, Lowlevel und Zerolevel.
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.
StartStoppSchwindel schrieb: > RS485 kennt doch > Highlevel, Lowlevel und Zerolevel. Nö. Der Bereich um 0V ist i.A. nicht definiert.
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
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.