Forum: Mikrocontroller und Digitale Elektronik RS485 Ende erkennung


von Keyboard (Gast)


Lesenswert?

hei,

bin dabei, mittels RS485 mehrere PIC zu verbinden.

Das senden vom Master zum Slave funktioniert, auch vom Slave zum Master

Ein Paket besteht aus:
ID
Anzahl der Byte
Paket Type
n Nutzbyte
Prüfsumme

wie erkennt der Master, das Ende des vom Slave gesendete Paket ?

nimmt man hier einen Timer, der bei jedem empfangen Byte auf Null 
gesetzt wird und das Paket nach Überlauf des Timer ausgewertet wird

oder

gibt man einem Timer eine feste Zeit, größer als die gesamtzeit für den 
Empfang aller Bytes, vor und nach Überlauf des Timer dann die Auswertung

schönen Tag

:
von Peter II (Gast)


Lesenswert?

ende ist dann wenn die Anzahl von Bytes die im Header stehen empfangen 
wurden. Nichts mit timer.

von Keyboard (Gast)


Lesenswert?

hei,

habe in diese Richtung auch schon gedacht.

was ist aber, wenn in dem Byte für die Anzahl der Wert falsch übertragen 
wurde ?

z.B.  statt 8  100

schönen Tag

von npn (Gast)


Lesenswert?

Keyboard schrieb:
> hei,
>
> habe in diese Richtung auch schon gedacht.
>
> was ist aber, wenn in dem Byte für die Anzahl der Wert falsch übertragen
> wurde ?
>
> z.B.  statt 8  100
>
> schönen Tag

Dann erkennst du das an der fehlerhaften Prüfsumme. Für solche Fälle ist 
sie ja da. Aber wie du die berechnest, weißt nur du allein. Die Länge 
sollte auf jeden Fall in die Berechnung mit einfließen, sonst erkennst 
du keinen Fehler im Längen-Byte (logisch).
Kurz gesagt, das Protokoll mußt du so gestalten, daß der Empfänger 
feststellen kann, wenn irgendein Übertragungsfehler passiert ist.

von error handling (Gast)


Lesenswert?

Du hast eine Master-Slave Kommunikation. Daraus ergibt sich ein 
SW-Handshake. Der Master fragtveinen bestimmten Slave ab und nur dieser 
antwortet. Den Aufbau der Antwort kennst du. Im Gutfall also kein 
Problem.
Welche Fehlermöglichkeiten gibt es? Daten Verfälschung, Slave nicht 
verfügbar, ...?
Für alle Fehlermöglichkeiten musst du dir eine Fehlerreaktioin 
überlegen. Die Fehlerfälle sind immer komplexer als die Gutfälle und 
schlucken mehr Entwicklerzeit als diue Gutfälle. Jeder nicht 
behandeltete Fehler lässt das Produkt "alt" aussehern. ;-)
Prüfsumme bhast du schon. Mit einem Timeout gerht auch viel.

von Peter II (Gast)


Lesenswert?

üblicher weise verwendet man noch einen Timeout. Wenn du also noch auf 2 
Bytes wartest die innerhalb von einer gewissen zeit nicht kommen, dann 
ist es Fehler. Und du setzte alles zurück.

von Nosnibor (Gast)


Lesenswert?

Normalerweise hat man immer eine Timerlösung, damit sich der Empfang bei 
Übertragungsfehlern wieder "einrenkt". Also Startbyte/Stopbyte bzw. 
Längenangabe und zusätzlich ein Maximalwert für die Lücke zwischen zwei 
Bytes beim Senden, und einen etwas längeren Timeout beim Empfänger als 
Notbremse, falls er anderweitig noch nicht gemerkt hat, daß das Paket zu 
Ende ist. Gesamtzeit kann man notfalls auch machen (wenn z.B. das 
Neustarten des Timers aufwendig ist), ist aber ungünstig, wenn man es 
mit stark unterschiedlichen Paketlängen zu tun hat.

Sich nur auf die Prüfsumme zu verlassen, kann lästig werden, denn wenn 
der Empfänger die Länge als zu groß mißverstanden hat, müssen erstmal so 
viele Bytes kommen, bevor er die "Prüfsumme" auswertet und den Fehler 
aufdeckt. Das kann dauern.

von Bole aus Serbien (Gast)


Lesenswert?

npn schrieb:
> Dann erkennst du das an der fehlerhaften Prüfsumme. Für solche Fälle ist
> sie ja da. Aber wie du die berechnest, weißt nur du allein. Die Länge
> sollte auf jeden Fall in die Berechnung mit einfließen, sonst erkennst

Ahem.
  Was ist aber wenn Länge=100, aber nur 8 Bytes gesendet werden ?
  Selbstverstandlich MUSS ein Timer vorhanden sein, sonst würde
  der Empfänger (Master oder Slave, egal) ewig warten.
  Vielleicht so:
  StartByt (0xAA) - Offset 0x00
  DstAdr          - Offset 0x01
  PcktNr          - Offset 0x02
  PckType         - Offset 0x03 ( ** )
  PcktLen         - Offset 0x04 ( nur NutzDaten)
  NutzDaten       - Offset 0x05..0xnn
  PcktCRC         - Offset 0xnn + 1 (aufs gesammte Paket)
  EndByt   (0xA9) - Offset 0xnn + 2
  ** 1 bit fur Antwort/Bestätigung reservieren, d.h.
  1 = Muss antworten/bestätigen

  In deiner ISR fur Empfang checkst du auf StartByt, Flag setzen,
  Bytes prüfen nach Offset, usw...

  mfg, Bole

von Georg (Gast)


Lesenswert?

Hallo,

es gibt eigentlich nur 2 sichere Möglichkeiten:

1. ein Abschlusszeichen, z.B. CR

2. die Übertragung erfolgt ohne grössere Pausen, danach kommt nichts 
mehr -> Timeout = Ende der Message

Das gilt auch bei bekannter Messagelänge, da ja was verlorengehen kann 
und dann neu auf den Messageanfang synchronisiert werden muss.

Georg

von Peter II (Gast)


Lesenswert?

Georg schrieb:
> es gibt eigentlich nur 2 sichere Möglichkeiten:
>
> 1. ein Abschlusszeichen, z.B. CR
> 2. die Übertragung erfolgt ohne grössere Pausen, danach kommt nichts
> mehr -> Timeout = Ende der Message

nein.

> 1. ein Abschlusszeichen, z.B. CR
man braucht kein Abschlusszeichen, wenn man die Länge am Anfang mit 
überträgt. Ich kenne kein Protokoll wo mit einem Abschlusszeichen 
gearbeitet wird. Wenn überhaupt wird ein Startzeichen festgelegt.

> 2. die Übertragung erfolgt ohne grössere Pausen, danach kommt nichts
> mehr -> Timeout = Ende der Message
wird auch kaum verwendet, weil es die mögliche Übertragungsrate viel zu 
sehr einschränkt.

von npn (Gast)


Lesenswert?

Bole aus Serbien schrieb:
> Ahem.
>   Was ist aber wenn Länge=100, aber nur 8 Bytes gesendet werden ?
>   Selbstverstandlich MUSS ein Timer vorhanden sein, sonst würde
>   der Empfänger (Master oder Slave, egal) ewig warten.

Das habe ich ja auch nie bestritten. Klar muß ein timeout vorhanden 
sein.

von Frank K. (fchk)


Lesenswert?

LIN arbeitet zB mit einem BREAK als Startsignal. Ein BREAK ist ein 
dominanter Pegel mit einer Länge von mindestens 13 Bitzeiten, quasi ein 
überlanges Startbit. Warum 13? 1 Startbit plus maximal 9 Datenbits plus 
maximal 2 Stoppbits sind 12 Bits insgesamt. Das ist bei einer 
asynchronen Verbindung die Parameterkombination mit der längstmöglichen 
Dauer. 13 Null-Bits können also normal niemals vorkommen.

Viele PICs (u.a. alle PIC24/dsPIC33 und PIC32) haben 
Hardware-LIN-Unterstützung und erkennen damit ein BREAK und lösen dann 
einen Interrupt aus.

fchk

von Bole aus Serbien (Gast)


Lesenswert?

Peter II schrieb:
> man braucht kein Abschlusszeichen, wenn man die Länge am Anfang mit
> überträgt. Ich kenne kein Protokoll wo mit einem Abschlusszeichen
> gearbeitet wird.

  CAN ?

> Wenn überhaupt wird ein Startzeichen festgelegt.

  Wenn überhaupt ? - Immer, ansonsten musste eine min.
  Frame-Pause vorhanden sein, folglich:
> wird auch kaum verwendet, weil es die mögliche Übertragungsrate
> viel zu sehr einschränkt.

 mfg, Bole

von Peter II (Gast)


Lesenswert?

Bole aus Serbien schrieb:
> Wenn überhaupt ? - Immer, ansonsten musste eine min.

bei RS232 gibt es kein extra start und ende zeichen. Dadurch kann es 
aber auch passieren das es sich nicht synchronisiert wenn mal keine 
Pause vorhanden ist.

von Bastler (Gast)


Lesenswert?

Bei Profibus wird auch mit Start-/ Stoppzeichen gearbeitet.
Längenangabe natürlich auch.

Aber ein Timeout zum "wieder einrenken" sollte schon vorhanden sein.

von Klaus B. (Gast)


Lesenswert?

Oder man sendet einen kontinuierlichen Stream und der Empfänger sucht 
sich die Nachrichten anhand der passenden CRC raus. Dann sollte man es 
aber vllt auf wenige Framegrößen beschränken, sonst steigt der Aufwand.

: Wiederhergestellt durch Moderator
von Georg (Gast)


Lesenswert?

Klaus B. schrieb:
> der Empfänger sucht
> sich die Nachrichten anhand der passenden CRC raus

Dann müsste ja man für jedes Bit eine neue CRC-Berechnung starten - ist 
das dein Ernst?

Viele hier scheitern ja schon an einer einzigen...

Georg

von Blocker (Gast)


Lesenswert?

Keyboard schrieb:
> was ist aber, wenn in dem Byte für die Anzahl der Wert falsch übertragen
> wurde ?
>
> z.B.  statt 8  100

Selber Schuld, wenn man so große Unterschiede in der erlaubten 
Paketlänge zuläßt.

von npn (Gast)


Lesenswert?

Blocker schrieb:
> Keyboard schrieb:
>> was ist aber, wenn in dem Byte für die Anzahl der Wert falsch übertragen
>> wurde ?
>>
>> z.B.  statt 8  100
>
> Selber Schuld, wenn man so große Unterschiede in der erlaubten
> Paketlänge zuläßt.

Was hat das mit der Größe des Unterschiedes zu tun?
Das Beispiel geht genauso mit "8 statt 10". Ohne Timeout wartest du da 
genauso wie bei 100.

Ob die 10 nicht erreicht werden oder die 100 nicht erreicht werden, ist 
doch völlig egal, meinst du nicht?

von Klaus B. (Gast)


Lesenswert?

>Viele hier scheitern ja schon an einer >einzigen...

Wenn es für eine mal geht, sollte für mehrere auch nicht mehr das 
Problem sein ;-)

>Dann müsste ja man für jedes Bit eine >neue CRC-Berechnung starten - ist das 
>dein Ernst?

Für jedes Byte.
Ja, ist mein ernst.

Der Empfänger berechnet bei jedem empfangenen Byte die CRC über alle 
möglichen Framelängen.
Möglichst bei der niedrigsten anfangen, dann kann man weiter suchen 
falls nichts dabei war.
War was dabei, nimmt er die Daten und verwirft die verwendeten Bytes aus 
seinem Puffer.
War  für alle Framelängen nichts dabei, verwirft er ein Byte und rechnet 
alles von vorne.

von Keyboard (Gast)


Lesenswert?

hei,

da für mich es die erste RS485 Übertragung zwischen µC ist, werde ich 
gemäß meinen ersten Beispiel folgen.

Mit jedem vom Master empfangenen Byte einen Timer mit Null starten und 
dessen Überlauf abwarten. Nach erfolgtem Überlauf des Timer dann das 
Paket auf Anzahl und Prüfsumme überprüfen. Erst danach, wenn alles ok, 
die vom Slave gesendete Daten übernehmen.

Die Zeit des Timer werde ich so wählen, das der Überlauf 1/3 entsprechen 
der Zeit eines Bytes danach statt findet.

Zusätzlich noch ein Timeout zur Sicherheit.

schönen Tag

von uwe (Gast)


Lesenswert?

1. Du kennst doch die Baudrate
2. Dann kommt ein Startbyte
3. Dann kommt eine ID
4. Dann die Länge
5. Aus der Länge und der Baudrate kannst du nun ausrechenen wie lange 
das Paket voraussichtlich dauern wird, noch die CRC mit einbeziehen in 
die Dauer und +10% Angst dazu. Timer Laden und Starten.
6. Bytes empfangen bis länge erreicht oder Timeout
7. Checksumme Prüfen, wenn nicht stimmt-> Paket verwerfen Fehler melden 
oder erneut anfordern

von Peter II (Gast)


Lesenswert?

Keyboard schrieb:
> Mit jedem vom Master empfangenen Byte einen Timer mit Null starten und
> dessen Überlauf abwarten. Nach erfolgtem Überlauf des Timer dann das
> Paket auf Anzahl und Prüfsumme überprüfen. Erst danach, wenn alles ok,
> die vom Slave gesendete Daten übernehmen.

finde ich ein dummes verfahren.

Warum nicht ohne diesen Timer (der Timeout-Timer ist OK) arbeiten. Wenn 
die Anzahl der Bytes empfangen hast, die du erwartest, hast du das ende.

Warum willst du jetzt noch warten?

von error handling (Gast)


Lesenswert?

Dein Timer ist ein Timeout!

Aber warum jedes einzelne Byte überwachen? Du kennst die Framelänge und 
die Zeit für einen ganzen Frame.

Zu Beginn des Empfangs den Timeout für den ganzen Frame aufziehen, dann 
den Frame anhand der Anzahl einlesen. Dann Fehlerprüfung der Daten. Oder 
es hat der Timeout zugeschlagen. Du hasst die Fehlerbehandlung so immer 
nach einem Frame. Bei der Timeoutzeit ist zu berücksichtigen, dass der 
Slave Verarbeitungszeit benötigt und dadurch eine kurze Pause zwischen 
einzelnen Bytes entstehen kann.

von Georg (Gast)


Lesenswert?

Peter II schrieb:
> Wenn
> die Anzahl der Bytes empfangen hast, die du erwartest, hast du das ende.

Du willst einfach nicht begreifen, dass bei einer Übertragung etwas 
schiefgehen kann und dann neu angesetzt werden muss. Deine Vorschläge an 
jemanden, für den das Thema neu ist, sind unverantwortlich.

Georg

von Cube_S (Gast)


Lesenswert?

Warum nicht Start/Ende-Markierungen. Ich habe das in einer Anwendung in 
der es nicht auf die Geschwindigkeit ankommt einmal so gemacht. Jeder 
Frame bestand aus einem Startzeichen, den Adress und Datenbytes 
(hexadezimal codiert) und einem Endezeichen ('\n').
Timeout für jedes Byte (lässt sich in Interrupts bequem zurücksetzen), 
bei Auftreten eines Timeout wird wieder auf das Startzeichen gewartet.

Das ganze hat auch noch den Vorteil, dass man an einem PC mittels RS485 
Adapter und einem Terminalprogramm(PUTTY) einfach mitlesen kann.

von Peter II (Gast)


Lesenswert?

Georg schrieb:
> Du willst einfach nicht begreifen, dass bei einer Übertragung etwas
> schiefgehen kann und dann neu angesetzt werden muss. Deine Vorschläge an
> jemanden, für den das Thema neu ist, sind unverantwortlich.

hä? Was soll denn da schief gehen?

Wenn im Header steht es sollen 5 Byte kommen, dann warten man bis man 5 
Bytes hat oder ein Timeout zuschlägt.

Das ist das übliche verfahren und wird überall angewendet.

Niemand kommt auf die Idee zu sagen, wenn 5 Sekunden nicht gekommen ist 
dann ist das ende reicht. Was ist wenn jemand den Stecker gezogen hat?

von bluppdidupp (Gast)


Lesenswert?

Man könnte auch generell keep-alive Frames senden lassen, dann braucht 
man ggf. sogar keinen Timeout. Der Puffer würde dann mit den keep-alive 
Daten gefüllt bis die einzulesende Länge erreicht ist und die Prüfsumme 
nicht passen wird.

Man sollte ggf. auch aufpassen, dass man bei falscher Prüfsumme nicht 
einfach alles bereits empfangende einfach wegwirft, sondern beim 
nächsten potentiellen Header/Startbyte weiterschaut. Sonst kann die 
Kommunikation dadurch auch sehr lange hängen bleiben, wenn man das Pech 
hat dass nie gerade ein Header/Startbyte nach dem "Empfänger-Reset" als 
nächstes reinkommt, sondern man immer irgendwo mitten in den Daten 
anfängt zu lesen.

von Nosnibor (Gast)


Lesenswert?

error handling schrieb:
> Aber warum jedes einzelne Byte überwachen? Du kennst die Framelänge und
> die Zeit für einen ganzen Frame.

Da die Framelänge variabel ist, kennt der Empfänger die Länge (und damit 
die Zeit für einen Frame) erst, wenn der Frame vollständig empfangen ist 
und die Prüfsumme sich als richtig erwiesen hat. Das ist zu spät.

Jedes Byte einzeln überwachen muß man, weil man im ungünstigsten Fall 
(wenn die Längenangabe fehlerhaft ankommt) nicht weiß, welches das 
letzte ist. Das weiß man erst, wenn kein Byte mehr kommt, also wenn seit 
dem letzten Byte eine gewisse Zeit verstrichen ist. Dazu muß der Timer 
beim letzten Byte gestartet worden sein, also bei jedem Byte.

von error handling (Gast)


Lesenswert?

Keep alive ist doch ganz daneben. Da es um Maste Sklave geht. Der Slave 
wird gepollt. Entweder er antwortet vollständig und richtig oder 
Timeout.

von error handling (Gast)


Lesenswert?

Nosnibor schrieb:
> error handling schrieb:
> Aber warum jedes einzelne Byte überwachen? Du kennst die Framelänge und
> die Zeit für einen ganzen Frame.
>
> Da die Framelänge variabel ist, kennt der Empfänger die Länge (und damit
> die Zeit für einen Frame) erst, wenn der Frame vollständig empfangen ist
> und die Prüfsumme sich als richtig erwiesen hat. Das ist zu spät.
>
> Jedes Byte einzeln überwachen muß man, weil man im ungünstigsten Fall
> (wenn die Längenangabe fehlerhaft ankommt) nicht weiß, welches das
> letzte ist. Das weiß man erst, wenn kein Byte mehr kommt, also wenn seit
> dem letzten Byte eine gewisse Zeit verstrichen ist. Dazu muß der Timer
> beim letzten Byte gestartet worden sein, also bei jedem Byte.

Schwachsinn hoch zehn!!!

Anhand der Baudrate und der Framelänge kann ich den Timeout genau 
bestimmen. In der Regel reicht ein TIMEOUT für die maximal im Protokoll 
vereinbarte Framelänge. Der Timeout wird hoffentlich selten zuschlagen.

Also macht es nicht komplizierter als es ist:
Timeout für ganzen Frame aufziehen,
Daten gemäß erwarteter Länge empfangen, oder Timeout,
Kein Timeout, Daten prüfen und bewerten,

Nächster Slave.

von Peter II (Gast)


Lesenswert?

error handling schrieb:
> Schwachsinn hoch zehn!!!
nein.

> Anhand der Baudrate und der Framelänge kann ich den Timeout genau
> bestimmen. In der Regel reicht ein TIMEOUT für die maximal im Protokoll
> vereinbarte Framelänge. Der Timeout wird hoffentlich selten zuschlagen.
dann musst du aber festlegen, das der Sender keine Pause zwischen den 
Bytes machen darf - das ist aber nicht üblich. Er kann ja gerade etwas 
besser zu tun bekommen.

Es werden mach mal sogar 2 Timeouts verwendet, einmal der Frame-Timeout 
und einmal ein Byte-Timeout.

von error handling (Gast)


Lesenswert?

Und was ist beim Timeout pro Byte und Sendepause???

Das macht nur bei einer SW-Uart Sinn, sonst ist das Schwachsinn hoch 20.

von Peter II (Gast)


Lesenswert?

error handling schrieb:
> Und was ist beim Timeout pro Byte und Sendepause???

man muss die werte sinnvoll festlegen. Wenn jede sekunde 1 Byte ankommt 
dann das durchaus normal sein. Dann hilft ein Frame-Timeout von 5 
Sekunden für ein 100byte packet nicht aus.

Die Übertragungsrate ist das obere Limit, aber sie muss nicht ständig 
ausgenutzt werden

von bluppdidupp (Gast)


Lesenswert?

error handling schrieb:
> Keep alive ist doch ganz daneben. Da es um Maste Sklave geht.

Stimmt, ich war in Gedanken schon wieder in die Allgemeinheit 
abgedriftet ;D

von error handling (Gast)


Lesenswert?

Peter II schrieb:
> error handling schrieb:
> Und was ist beim Timeout pro Byte und Sendepause???
>
> man muss die werte sinnvoll festlegen. Wenn jede sekunde 1 Byte ankommt
> dann das durchaus normal sein. Dann hilft ein Frame-Timeout von 5
> Sekunden für ein 100byte packet nicht aus.
>
> Die Übertragungsrate ist das obere Limit, aber sie muss nicht ständig
> ausgenutzt werden

Genau, das obere Limit. Das gilt es auch zu über wachen.
-> Timeout über den ganzen Frame!

 Bei HW-Uart nimmt man keinen Timeout pro Byte. Völlig unnütz.

von L. R. (keyboard)


Lesenswert?

hei,

Vielen Dank für alle Info.

Die Praxis wird es zeigen, war am besten geeignet ist.

Ich selbst finde den nachgetriggerten Timer am besten, da die Frame 
Länge variabel ist.

Zusätzlich noch Timeout für die Sicherheit und um dem Master zu 
signalisieren, du darfst wieder senden.

schönen Tag

von Bole aus Serbien (Gast)


Lesenswert?

L. R. schrieb:
> Ich selbst finde den nachgetriggerten Timer am besten, da die Frame
> Länge variabel ist.

 Timer fur die einzelnen Bytes brauchst du nicht, weil:
  a) Bytes in ISR empfangen werden, nicht in einer Schleife.
  b) Sender kann 3 Bytes hintereinander senden, dann 1 Byte Pause
     machen. Wieso ? Na, seine ISR hat zugeschlagen und die hat
    höhere Priorität als LAN (Echtzeit usw.)...

> Zusätzlich noch Timeout für die Sicherheit und um dem Master zu
> signalisieren, du darfst wieder senden.

 Probier es mal so:
 Wenn das Startzeichen erkannt wird, Pointer löschen und Flag setzen
 - nicht mehr und nicht weniger.
 Byte danach muss deine Adresse sein, sonst Flag zurucksetzen -
  (deswegen wird die Adresse als zweites Byte gesendet).
 Wenn das LängenByte ankommt, benötigte TimeFrame ausrechnen, z.B.
  (ByteZahl * ByteTime) + (ByteZahl * MaxInterByteZeit) + ZeitBonus
 ZeitBonus kannst du locker auf 1Sec. stellen, es macht gar
 keinen Unterschied.
 Timer starten, mit Arbeit fortfahren und Bytes in ISR empfangen.
 Wenn CRC empfangen und OK ist, Flag fur MsgOK setzen.

 Nun, warum dann das Endzeichen ?
 Weil es InterFrameTime ersetzt und der Empfanger ausserdem Zeit hat,
 Message auf Fehler zu prufen, evtl. EmpfangsBuffer zu verschieben,
 damit neue Messages empfangen werden können.
 Wenn Antwort verlangt wird, kann die schon vorbereitet werden, usw.
 Wenn das alles OK ist und Endzeichen ankommt, Empfanger ist schon
 bereit, um sofort Befehl auszufuhren oder zu antworten.


Ich hoffe, das wird nicht gelöscht :)

 mfg, Bole

von Nosnibor (Gast)


Lesenswert?

Bole aus Serbien schrieb:
>  Timer fur die einzelnen Bytes brauchst du nicht, weil:
>   a) Bytes in ISR empfangen werden, nicht in einer Schleife.

Was hat das eine mit dem anderen zu tun?

Der Timer, der bei jedem empfangenen Byte neu gestartet wird, ist ja 
nicht für das Byte, sondern für die Pause dahinter (falls eine kommt). 
Einfach eine Möglichkeit, zuverlässig (unabhängig von Bitfehlern) und 
schnell (zügig nach Ende des Frames, egal wie lang der Frame ist, oder 
welche Länge der Empfänger erwartet) das Ende des Frames zu erkennen.

Das ist ein robuster Mechanismus, Framing sicherzustellen, ohne daß man 
sich auf die übertragenen Daten verlassen muß, die ja möglicherweise 
nicht stimmen (solange die Prüfsumme noch nicht geprüft ist). Natürlich 
muß man dazu das Timing festlegen (maximale Lücke zwischen zwei Bytes 
eines Frames und minimale Pause zwischen Frames), und der Sender muß 
sich auch daran halten.
Aber irgendwelche Schätzwerte aus der empfangenen Längenangabe zu 
berechnen ist optimistisch und versagt genau dann, wenn man den Timer 
wirklich braucht, nämlich bei Übertragungsfehlern in der Längenangabe.

von Bole aus Serbien (Gast)


Lesenswert?

Nosnibor schrieb:
>>  Timer fur die einzelnen Bytes brauchst du nicht, weil:
>>   a) Bytes in ISR empfangen werden, nicht in einer Schleife.
>
> Was hat das eine mit dem anderen zu tun?

 Weil der Empfanger lustig seiner Arbeit nachgeht (wie ublich)


> Der Timer, der bei jedem empfangenen Byte neu gestartet wird, ist ja
> nicht für das Byte, sondern für die Pause dahinter (falls eine kommt).

 Lese unter b)

> muß man dazu das Timing festlegen (maximale Lücke zwischen zwei Bytes
> eines Frames und minimale Pause zwischen Frames), und der Sender muß
> sich auch daran halten.

 Und wenn er das nicht kann ?
 (Wichtigere Aufgaben in Echtzeit erledigen) ?
 Master sendet immer vollstandige Frames, in Sistemen die auf
 Sicherheit ausgelegt sind, muss auch jede gesendete Frame bestatigt
 werden.Deswegen sind CAN-Frames so kurz.
 Jetzt aber sendest du eine Frame mit 60 Bytes NutzDaten.Die must
 du komplett rausschicken, weil es RS485 ist, also keine Arbitration,
 deine InterFrameZeit abwarten und auf Bestatigung warten...
 Es war aber eine InterByteZeit 100uS langer als vereinbart.Und was
 jetzt ?
 Die ganze Frame verwerfen, wegen 100uS Verzogerung ?
 Nochmals 60+n Bytes senden ?

 Und ausserdem:
 InterFrameZeit muss mindestens 2 Zeichen betragen, darum ist
 Endzeichen schneller, sicherer und wird meistens verwendet.

 mfg, Bole

von hw (Gast)


Lesenswert?

Bole aus Serbien schrieb:
> Die must du komplett rausschicken, weil es RS485 ist

Was hat die definition der hardware (rs485) mit dem rausschicken der 
daten zu tun?
rs485 definiert nur die hardware, aber keinerlei softwareprotokoll

von Bole aus Serbien (Gast)


Lesenswert?

hw schrieb:
> rs485 definiert nur die hardware, aber keinerlei softwareprotokoll

 Beim LAN (RS422/485) ist es ist nicht üblich, dass der Sender die
 Logic-Level der gesendeten Daten pruft.Beim CAN ja.

von hw (Gast)


Lesenswert?

Bole aus Serbien schrieb:
> hw schrieb:
>> rs485 definiert nur die hardware, aber keinerlei softwareprotokoll
>
>  Beim LAN (RS422/485) ist es ist nicht üblich, dass der Sender die
>  Logic-Level der gesendeten Daten pruft.Beim CAN ja.

LAN ist kein rs422.
und rs422 ist kein rs485, sondern nur eine untermenge des 485standards
du schmeist hier alles durchnander.
rs485 definiert nur die hardware, sonst gar nix. da wird nur festgelegt 
dass es zwei differentielle leitungen gibt, auf denen eine bitfolge 
übertragen werden kann. da ist keine anzahl bits definiert, kein start 
und stopbit, kein protokoll, nix dergleichen.

warum schreibst du dann
Bole aus Serbien schrieb:
> Jetzt aber sendest du eine Frame mit 60 Bytes NutzDaten.Die must
>  du komplett rausschicken, weil es RS485 ist

von Bole aus Serbien (Gast)


Lesenswert?

hw schrieb:
> LAN ist kein rs422.
> und rs422 ist kein rs485, sondern nur eine untermenge des 485standards
> du schmeist hier alles durchnander.
> rs485 definiert nur die hardware, sonst gar nix. da wird nur festgelegt
> dass es zwei differentielle leitungen gibt, auf denen eine bitfolge
> übertragen werden kann. da ist keine anzahl bits definiert, kein start
> und stopbit, kein protokoll, nix dergleichen.

    MODERATOR ????
 HIIIILFE !!
 Warum hacken halbgebildete an mir rum ?
 Weil ich aus Serbien bin ?

 Als ich schrieb, dass RS232 ein Standard und kein Protokoll ist,
 wurde das prompt geloscht.
 Ist hier vielleicht username gewechselt, damit weiter unnutze und
 dumme Kommentare gesendet werden ?

von Nosnibor (Gast)


Lesenswert?

Bole aus Serbien schrieb:
>  Es war aber eine InterByteZeit 100uS langer als vereinbart.Und was
>  jetzt ?
>  Die ganze Frame verwerfen, wegen 100uS Verzogerung ?

Ja. Wenn der Sender es nicht schafft, eine protokollkonforme Nachricht 
zu senden, dann kommt eben keine Nachricht beim Empfänger an. Ist 
woanders auch so: wenn einer stammelt und lallt, weil er sich nicht mehr 
genug aufs Sprechen konzentrieren kann, versteht ihn eben keiner.

Das ist eine Frage der Prioritäten. Man kann ein Protokoll definieren 
mit sauberem Framing, basierend auf klar erkennbaren Pausen zwischen den 
Frames (das heiß ja nicht, daß es innerhalb eines Frames keine Pausen 
geben darf. Nur kurz genug müssen sie sein), und dann muß man eben den 
Sender so schreiben, daß er das einhält, z.B. indem er sich einen Frame 
fertig in den Speicher bereitlegt zum Senden, anstatt alles on-the-fly 
zusammenzubauen. Das halte ich für sinnvoll, aber bei einer geeigneten 
Kombination von Voraussetzungen kann es auch günstiger sein, das Timing 
auf dieser Ebene lockerer zu lassen. Dann würde man im Empfänger einen 
Timer mit einer Art Watchdog-Funktion verwenden: "vor zehn Sekunden 
wurde ein Frame begonnen. Wenn der jetzt noch nicht fertig ist, wird das 
nie mehr was, also braucht der Empfangs-Zustandsautomat einen Reset". 
Dann muß man eben auch mit den Nachteilen des gröberen Timings leben: 
bei einem Übertragungsfehler ist die Kommunikation länger gestört.

von hw (Gast)


Lesenswert?

Bole aus Serbien schrieb:
> MODERATOR ????
>  HIIIILFE !!
>  Warum hacken halbgebildete an mir rum ?
>  Weil ich aus Serbien bin ?

hör auf hier rumzuschreien. lies lieber die beschreibung von rs485. da 
steht unter anderem:
"Im Gegensatz zu anderen Bussen sind bei EIA-485 nur die elektrischen 
Schnittstellenbedingungen definiert."

soviel zum thema halbgebildete
übrigens dieser standard gilt auch in serbien.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

hw schrieb:
> hör auf hier rumzuschreien. lies lieber die beschreibung von rs485. da
> steht unter anderem:
> "Im Gegensatz zu anderen Bussen sind bei EIA-485 nur die elektrischen
> Schnittstellenbedingungen definiert."

 Lieber vom Anfang an durchlesen, dumme und unnötige Bemerkungen
 beiseite lassen.

Keyboard schrieb:
> hei,
>
> bin dabei, mittels RS485 mehrere PIC zu verbinden.

von hw (Gast)


Lesenswert?

Marc Vesely schrieb:
> hw schrieb:
>> hör auf hier rumzuschreien. lies lieber die beschreibung von rs485. da
>> steht unter anderem:
>> "Im Gegensatz zu anderen Bussen sind bei EIA-485 nur die elektrischen
>> Schnittstellenbedingungen definiert."
>
>  Lieber vom Anfang an durchlesen, dumme und unnötige Bemerkungen
>  beiseite lassen.
>
> Keyboard schrieb:
>> hei,
>>
>> bin dabei, mittels RS485 mehrere PIC zu verbinden.

ja, und? das ändert doch überhaupt nichts an der tatsache, daß die rs485 
nunmal keinerlei software definiert, sondern ausschließlich die 
hardware.

und auch mit einem pic kann man beispielsweise 1 bit pro stunde mit 20 
stoppbits übertragen und trotzdem bleibt es eine rs485. war nur ein 
extrembeispiel, aber was man über rs485 überträgt und in welchem format 
und protokoll, ist total egal. rs485 bleibt es trotzdem.

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.