Laden...

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

Erstellt von csharp_starter vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.032 Views
C
csharp_starter Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren
Warum ist Serialport.ReadExisting mit Binärdaten mit C# so langsam?

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

T
2.219 Beiträge seit 2008
vor 3 Jahren

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.

4.931 Beiträge seit 2008
vor 3 Jahren

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.

C
csharp_starter Themenstarter:in
2 Beiträge seit 2020
vor 3 Jahren

perfekt, danke!
Irgendwann hatte ich das schonmal drin gehabt aber dann nicht mehr dran gedacht.
Jetzt ist es bedeutend schneller 👍