Forum: PC-Programmierung RS232 empfang mit C#


von Martin (Gast)


Lesenswert?

Guten Morgen!

Ich bin gerade dabei dass ich mich in C# einlerne. Nun möchte ich ein, 
denke ich, einfaches Programm erstellen womit ich Daten von einen 
Mikroprozessor empfange und an eine Label.text Ausgebe.

Die Daten kommen so [Byte][Byte][Byte][Byte][Byte][Byte][EndByte]

Ich lese es mir Readexisting ein und kann es auch ausgeben.
Aber, die Daten kommen so schnell bzw. die nächsten kommen gleich nach 
dass man nicht mehr erkennen kann wo das erste Byte ist.

Nun meine Frage wie kann ich mich an das letzte Byte [EndByte] 
Synchronisieren damit ich immer meine 6Byte+[EndByte] auswerten kann?

Danke für die Hilfe!

von Markus U. (markjus) Benutzerseite


Lesenswert?

Wie sieht denn bisher Dein Code aus?

von Sven H. (dsb_sven)


Lesenswert?

Du kannst einstellen, nach wie vielen empfangenen Bytes der Event 
ausgelöst wird.

Du kannst alternativ auch alle Daten in z.B. eine Liste schreiben und 
diese nach dem EndByte durchsuchen und, wenn das EndByte angekommen ist, 
alle Bytes aus der Liste in die Datei schreiben.

Wenn ich mich nicht irre, kannst du auch das EndByte als 
Zeilenumbruchzeichen definieren und ReadLine() benutzen. Problem dabei: 
das EndByte darf (!!) nicht in den Daten vorkommen. Das ist bei Variante 
zwei ebenfalls ein Problem.

von Peter II (Gast)


Lesenswert?

vergiss die Vorschläge mit ReadLine und Readexisting. Das sind String 
funktionen. Wenn du bytes empfangen willst dann verwende Read oder 
Readbyte. Sonst handelst du dir nur ärger mit der 
Zeichensatz-Konvertierung ein.


erstmal ohne events.


byte b = com.ReadByte();

von Thomas E. (thomase)


Lesenswert?

Martin schrieb:
> Nun meine Frage wie kann ich mich an das letzte Byte [EndByte]
> Synchronisieren damit ich immer meine 6Byte+[EndByte] auswerten kann?
Dein Problem hat mit C# erstmal gar nichts zu tun.
Du überträgst Daten ohne jegliches Protokoll.
Wozu sendest du ein "Endbyte"?
Du brauchst kein End- sondern ein Startbyte, damit der Empfänger sich 
darauf synchronisieren kann. Zuende ist der Datenblock dann, wenn die 
vereinbarte Zahl an Daten empfangen wurde. Wie soll sich denn der 
Empfänger auf den 1. Block synchronisieren? Da gab es vorher kein 
Endbyte.

Aber ein Synchronisationsbyte muss eindeutig sein. Das ist bei binärer 
Übertragung aber nicht der Fall. Denn die Daten können jeden Wert von 0 
255 annehmen. Und somit auch für ein Sync-Byte gehalten werden.

Deshalb überträgt man die Daten im Ascii-Format. Also aus jedem 
Nutzdaten-Byte werden 2 Ascii-Zeichen, die nur die Werte von 0x30-0x39 
oder 0x41-0x46 bzw. 0x61-0x66 annehmen können. Alle anderen Werte stehen 
dann zur Synchronisation oder für andere Zwecke, z.B. Acknowledge, zur 
Verfügung.

Z.B. kann man nach jedem empfangenen Block ein Acknowledge senden, auf 
das der Sender wartet, bevor er den nächsten Block sendet. Man kann auch 
die Daten noch prüfen und ggf. ein NACK senden, was den Sender den 
letzten Block wiederholen lässt.

Das verdoppelt zwar die Menge der zu übertragenden Bytes, also halbiert 
den Datendurchsatz, steigert aber die Sicherheit auf 100%.


mfg.

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.