Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Warum ist Serialport.ReadExisting mit Binärdaten mit C# so langsam?
csharp_starter
myCSharp.de - Member



Dabei seit:
Beiträge: 2

Themenstarter:

Warum ist Serialport.ReadExisting mit Binärdaten mit C# so langsam?

beantworten | zitieren | melden

Hallo zusammen
ich versuche gerade eine Kommunikation mit Binärdaten zwischen µC und PC über die serielle Schnitstelle (USB-CDC, virtuelle Schnittstelle) herzustellen. Grundsätzlich funktioniert das ganze auch, nur im c# mit GUI unglaublich langsam.


Mein Aufbau sieht folgendermaßen aus:
Backgroundworker schaut mit BytesToRead nach ob neue Daten da sind, und wenn ja kommt ein readByte in eine ConcurrentQueue und die weitere Verarbeitung erfolgt wenn alle Daten aus dem Buffer gelesen sind (BytesToRead = 0)

Das laden in die Queue dauert für etwa 160000 Bytes etwa 7 Sekunden.... Wenn ich das gleiche im HTerm mache, sind die 160000 Bytes quasi sofort sichtbar. Wie bekomme ich die sache also schneller?

Meine Idee war nicht jedes Byte einzeln auszulesen, sondern mit ReadExisting... leider geht das nur als String und ist damit bei Binärdaten unbrauchbar. Oder kann ich irgendwie definieren, dass ReadExisting nicht aus binär 0xAA ein "?" macht? Die Daten (z.B. 0xAA) welche nicht als Charakter darstellbar sind, werden offensichtlich alle zu "?" gemacht, was ein zurückwandeln in Binärdaten leider unmöglich macht.

Vielen Dank,

csharp_starter
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1767
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Warum liest du dann die Bytes nicht mit Read aus?
Um einen Block von Bytes zu lesen nutzt man Read mit dem Byte Array, dem Offset und der Länge.
Dort musst du nur ein Byte Array hingeben und die Daten einlesen lassen.
Als Rückgabe Wert bekommst du die Anzahl der Bytes, die gelesen wurden.

SerialPort.Read

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3946

beantworten | zitieren | melden

ReadExisting ist ja nur ein Hilfsmethode zum Auslesen mittels des aktuell eingestellten Encodings. In BytesToRead steht ja die Anzahl und mittels Read(byte[] buffer, int offset, int count) kannst du diese dann in einen eigenen Puffer kopieren lassen.
private Nachricht | Beiträge des Benutzers
csharp_starter
myCSharp.de - Member



Dabei seit:
Beiträge: 2

Themenstarter:

beantworten | zitieren | melden

perfekt, danke!
Irgendwann hatte ich das schonmal drin gehabt aber dann nicht mehr dran gedacht.
Jetzt ist es bedeutend schneller
private Nachricht | Beiträge des Benutzers