RS-232, Datenverlust feststellen

OP #2524671
Lesenswert?

Hallo Leute,

ich habe eine Kommunikation zwischen PC und µC via RS-232. Meine Daten 
sehen wie folgt aus:

STARTBYTE | ID | Datenlänge n | DATEN[0...n-1] | Prüfbyte | STOPBYTE

Nun habe ich das Problem, dass manchmal ein Byte falsch gesendet wird. 
Ich sende testweise immer 3 Bytes als Daten 11 21 31. Manchmal kommt 
anstatt der 11 eine 0.

Woher könnte das kommen, und wie kann ich Pakete mit einer 0 anstatt 
einer 11 entlarven?
Gast #2524683
Lesenswert?

Sollte diene Prüfsumme nicht genau dafür da sein, um Übertragunsfehler 
zu erkennen?

Übertragungsfehler sind ganz normal. Deshalb implementiert man 
mechanismen, z.B. CRC, um so etwas zu erkennen.

Wie wird der Takt für RS232 im uC erzeugt? wenn es genau sein soll, wird 
gerne ein passendes Baudratenquarz oder Fraktalgenerator verwendet.
OP #2524705
Lesenswert?

Also Takt gibts von einem 16MHz Quarz. Die Prüfsumme ist bis jetzt noch 
nicht implementiert. Die habe ich nur schon mit hingeschrieben, weil 
meine Frage darauf abzielt, eine solche einzuführen. Ich weiß nur leider 
nicht genau wie. Ich denke bereits über eine CRC8 nach, habe aber noch 
nicht verstanden, wie ich diese auf ca. 25Bytes anwenden kann?
Gast #2524725
Lesenswert?

Was für ein Kontroller? Hat der einen Fraktalgenerator? Normalerweise 
wird die Taktrate mit einem Teiler eingestellt, der in einem Register 
abgelegt wird. In den Handbüchern ist meistens eine Formel angegeben, 
mit der man die Fehlerrate berechnen kannst.

Was für einen Controller verwendest du? Du solltest mehr Informationen 
bereitstellen, was du machen willst.

Als nächstes musst du wissen, welche Fehlerrate akzeptabel ist. Du musst 
dir auch überlegen, welche Fehler vom Übertragungsverfahren selbst 
korrigiert oder nur erkannt werden sollen.

Ja nach Randbedingungen würde z.B. ein Paritybit ausreichen.
Zu CRC steht eigentlich bei Wikipedia genug, wo genau liegt dein 
Problem?
Du nimmt einfach deine 25Byte als lange Zahl und führst die 
Polynomdivision durch.

Relevant ist auch, was bei einem Fehler passieren soll. Sollen die Daten 
nochmals gesendet werden oder nur die fehlerhaften weggeschmissen?
#2525060
Lesenswert?

@  Stephan Meter (multimeter90)

>Also verwendet wir ein PIC18F6620. Takt wird über Register eingestellt.
>Bei mir sind es 19.230 baud (+1.6%).

Welche Taktquelle? Ein Quarz?

http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART

Gilt auch für PICs ;-)

>Und wegen meinem Problem mit dem CRC. Meine Frage ist da halt, wie ich
>diese auf mehrere Bytes anwenden kann ohne diese zu einer großen Zahl
>zusammen zu fassen.

Siehe CRC.

Für einfachere Sachen reicht auch ein einfacher Parity Check.

MFG
Falk
Moderator (Firma: Titel) Persönliche Seite #2525083
Lesenswert?

spess53 schrieb:
>>Bei mir sind es 19.230 baud (+1.6%).
> Bei mir 0,16%.
Fängt ja schon gut an...

Stephan Meter schrieb:
> Die Prüfsumme ist bis jetzt noch
> nicht implementiert. Die habe ich nur schon mit hingeschrieben, weil
> meine Frage darauf abzielt, eine solche einzuführen. Ich weiß nur leider
> nicht genau wie.
Die einfachste Prüfsumme wird durch eine Addition aller gesendeten Bytes 
gewonnen. Von dieser Summe wird dann nur das niedrigste Byte 
verwendet/versendet (ganz einfach, wenn zur Berechnung nur ein char 
verwendet wird). Diese Vorgehensweise reicht in einem Großteil der Fälle 
aus.

Stephan Meter schrieb:
> Meine Daten sehen wie folgt aus:
> STARTBYTE | ID | Datenlänge n | DATEN[0...n-1] | Prüfbyte | STOPBYTE
Ich hoffe, du hast soweit gedacht, ALLE Daten als ASCII-Text zu 
versenden...
Oder überleg dir mal, was passiert, wenn dein Startbyte z.B. 0x02 ist, 
und du dann noch ein paar Daten hast, die ebenfalls 0x02 sind. Hast du 
daran gedacht? Kommt deine Software damit klar?

Tilo Lutz schrieb:
> wenn es genau sein soll, wird gerne ein ... Fraktalgenerator verwendet.
Habe ich noch nie gehört.
WIE bzw. WO wird ein Fraktalgenerator zur Baudratenerzeugung genommen?
Hast du da mal eine Quelle/Link dazu?
Moderator (Firma: Titel) Persönliche Seite #2525104
Lesenswert?

1
The Clock Generation logic has a fractional baud rate generator...
Da bin ich aber beruhigt, ich meinte schon, eine grundlegende technische 
Entwicklung verschlafen zu haben. Das hast zum Glück mit Teilern, 
Teilerverhältnissen und Resten zu tun, aber absolut nichts mit 
Fraktalen...
http://en.wikipedia.org/wiki/Fractal
http://en.wikipedia.org/wiki/Fractional
http://www.dict.cc/englisch-deutsch/fractal.html
http://www.dict.cc/englisch-deutsch/fractional.html

EDIT: Falk war schneller... ;-)
#2525109
Lesenswert?

Hallo,

kann ich spess53 nur zustimmen.

So als persöhnliche Erfahrung: ca. 20m geschirmtes Kabel zwischen 2 
Rechnern in normaler Umgebung mit 38400 nie Übertragungsfehler, bei 
57600 ca. alle 2-3 Minuten einen.
Große Dateien mit ZModem übertragen, bei 57600 gab es dann die ersten 
Wiederholungen.

Gruß aus Berlin
Michael
#2525114
Lesenswert?

Stephan Meter schrieb:
> naja wie gesagt, es werden nur manchmal bytes als 0 gelesen.

In welcher Umgebung?

Alles was nicht länger als 20 Meter ist, in der Nähe keine starken 
Motoren hat oder über eine Telefonleitung läuft (und vielleicht noch ein 
paar ekelige Dinge, die mir jetzt nicht einfallen) darf überhaupt keine 
Übertragungsfehler aufweisen!
Ansonsten hast du schlicht und ergreifend irgendwo einen Fehler. Den 
gilt es erst mal zu eliminieren.
Vom µC zum PC auf 2 Meter Distanz mit einem sauberen Kabel, das muss bei 
19200 Baud flutschen wie eine Eins.
Gast #2525138
Lesenswert?

Hi

>Es sind nicht einmal ein Meter. Ich kann aber leider nicht sagen woher
>die 0 kommt.

Dann wäre der erste Schritt die Fehlermeldung der UART auszuwerten. AVRs 
und PICs können z.B. Dataoverrun und Frameerror (auf Byteebene) 
erkennen.

MfG Spess
#2525144
Lesenswert?

Stephan Meter schrieb:
> Auch die vermeindliche 0 kommt sauber an, sonst
> würde sie ja nicht erkannt.

Wenn die 0 "sauber ankommt", heißt das ja, sie wurde empfangen. Also ist 
der Fehler auf der Senderseite. Wenn keine 0 ankommt, ist der Fehler auf 
der Empfängerseite.

Auf jeden Fall wird es ein Softwarefehler sein, den Du suchen mußt.
Eine CRC ist der falsche Ansatz.


Peter
#2525152
Lesenswert?

@  Stephan Meter (multimeter90)

>Ich glaube es liegt an der Empfängerseite. Der Fehler tritt nur bei dem
>ersten empfangenen Paket auf. Und dann immer im 0.ten Datenbyte.
>Ich hatte am Anfang auch schon, dass ich beim ersten lesen der
>Schnittstelle so ca. 20 Nullen bekommen habe.

Klingt nach einem TX-Pin, das ab und an "runter fällt", z.B. wenn 
irrtümlich der UART neu initialisiert wird. Passiert auch oft bei 
RS485 Bussen, wenn nach dem Senden der Sender abschaltet und die 
richtigen Pull-Ups/Terminierungen am Bus fehlen.

MFG
Falk
#2525367
Lesenswert?

ja, floatende Leitungen bei 485 oder zu frühes / zu spätes Umschalten 
des Datenflusses kann schöne Effekte erzielen. Letztes Byte 
abgeschnitten oder erstes Byte abgeschnitten ...

Mitunter brauchen die UARTS aber auch etwas bis sie sich synchronisieren 
bei asynchroner Übertragung.
Die CRC kann schon sehr nützlich sein. Hab gerade ne Anwendung in der 
Mache wo ne spezielle CRC eingesetzt wird um den Vertriebskanal des 
Herstellers zu schützen, sprich keine Fremdhardware an dem Bus ... grrr
#2525525
Lesenswert?

Stephan Meter schrieb:
> STARTBYTE | ID | Datenlänge n | DATEN[0...n-1] | Prüfbyte | STOPBYTE

Stephan Meter schrieb:
> Ich glaube es liegt an der Empfängerseite. Der Fehler tritt nur bei dem
>
> ersten empfangenen Paket auf. Und dann immer im 0.ten Datenbyte.
>
> Ich hatte am Anfang auch schon, dass ich beim ersten lesen der
>
> Schnittstelle so ca. 20 Nullen bekommen habe.

Startbyte, ID und Datenlänge werden korrekt erkannt und erst 
Datenbyte[0]?
Oder ist es immer das erste byte, welches nicht erkannt wird.
Liest dein Empfänger im Interrupt?
#2525686
Lesenswert?

Was ist die Empfängerseite? Der PC oder der µC?
Wie liest du auf dem PC / µC
Wenn es immer das gleiche Byte ist dann ist der Fehler mit großer 
Wahrscheinlichkeit in der Software zu suchen.
Tritt er nur manchmal auf könnte es z.B. eine nicht initialisierte 
lokale Variable auf dem Stack sein. je nachdam was zufällig drinsteht 
geht es mal und mal nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren