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
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.
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.
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.
perfekt, danke!
Irgendwann hatte ich das schonmal drin gehabt aber dann nicht mehr dran gedacht.
Jetzt ist es bedeutend schneller 👍