Hallo Leute
ich sitze gerade an einem Programm mit GUI, welches eine menge Daten per
Serial Port einlesen soll. Leider hängt es bei mir immer wieder an der
Datenrate. Um dies besser zu untersuchen, habe ich den betreffenden code
in eine extra konsolen Anwendung gepackt:
Am anderen Ende des Serieal Ports hängt ein einfacher Arduino Mega per
USB am Rechenr, der mit 500000 Baut Zeichenfolgen mit \n als endzeichen
sendet. Diese Zeichenfolgen sind im wechsel mal 60 bytes mal 50 bytes
lang.
Mit den integern eins zwei und drei dokumentiere ich die die Bufferlänge
der lesbaren Daten vor dem ausnlesen, die bufferlänge meiner
ausgelesenen Daten und die bufferlänge der lasbaren Daten nach dem
auslesen.
Mit folgendem Coode rufe ich die Methoden auf und lasse mir nachdem ich
zum abbrechen die Enter Taste gedückt habe die eins, zwei und drei werte
in eine Datei schreiben (in Methode Stop()):
1
staticvoidMain(string[]args)
2
{
3
UART_cuart=newUART_c();
4
Console.ReadLine();
5
uart.Stop();
6
}
Jetzt zu den ergebnissen:
eins zwei drei
3968 3968 0000
1213 1281 2687
2687 2687 0000
1184 1249 2719
2719 2719 0000
1439 1502 1574
2466 2466 0000
1323 1383 2154
2443 2577 0008
0008 0008 0000
1490 1556 1797
2023 2070 0342
0342 0342 0000
0849 0951 1034
1304 1357 0381
0509 0566 0357
0483 0536 0427
0558 0558 0000
1468 1583 1023
1569 1630 0755
0755 0755 0000
1479 1539 1207
1495 1550 0879
0879 0879 0000
Und nun zu meinen Problem. Nach dem ersten dongleDatenEmpfangEvent sind
schon 3968 Zeichen im Buffer. Ok könnte sein, dass das Programm beim
Starten etwas braucht aber beim zweiten Event sind schon wieder mehr als
1000 Zeichen da. Dabei erwarte ich ja eigentlich nur knapp 100 Zeichen.
Ok vielleicht ist das Windows 10 System im Hintergrund etwas langsamer.
So könnte es passieren, dass das Event zwei oder drei Datenpakete (50er
oder 60er Zeichenfolge) später kommt aber doch nicht 20 oder 40
Datenpakete später. Schießlich abreite ich auf einem i7-4500U Prozessor,
da kann doch nich der popelige Arduino, der die Zeichenketten sich jedes
mal neu zusammenbaut, schneller sein?
Ist das C# so langsam oder habe ich ein Windows Resourcen Problem?
Ben S. schrieb:> Und nun zu meinen Problem. Nach dem ersten dongleDatenEmpfangEvent sind> schon 3968 Zeichen im Buffer. Ok könnte sein, dass das Programm beim> Starten etwas braucht aber beim zweiten Event sind schon wieder mehr als> 1000 Zeichen da. Dabei erwarte ich ja eigentlich nur knapp 100 Zeichen.
hast du mal geschaut das in den Daten drin steht? Eventuell läuft etwas
komplett schief und die bekommt sehr schnell sehr viel Müll.
Die Daten stimmen "leider". Der Arduino simuliert eigentlich nur das
echte System, was ich später auslesen will. Der Arduino baut mir nur
Zeichenfolgen zusammen, die ähnlich sind, wie ich sie vom Zielsystem
erwarte. mit dabei ist eine Laufende Nummer, mit der ich kontollieren
kann, ob Datensätze verloren gegegangen sind.
Wie ich am Anfang geschrieben habe, sind die gezeigten Coode Abschnitte
aus dem eigentlichen Programm. Dort habe ich mir das auch mal mit dem
Buffergrößen angeben lassen. Dort ist es sogar so, dass der Resived
Buffer ständig voll ist. Daran wieder das komische, mir gehen keine
Daten verloren, also muss das Windows die daten vor diesem Buffer nocht
irgendwo zwischenpeichern.
Ben S. schrieb:> Die Daten stimmen "leider".
dann macht es doch mal ohne Event. Wenn du eh einen eigenen Thread hast,
wozu dann noch mit Events arbeiten?
du könntest mal noch die Zeitpunkte der Events mit ausgeben. Da muss ja
sehr viel Zeit vergehen.
Wie hoch ist die CPU last, wenn das Programm läuft?
das Eventgesteuerte will ich eigentlich behalten, da ich nicht immer
solche schnellen Datensatzwiederholungen erwarte. es könnte auch mal
eine stunde pause sein und dann gehts wieder los...
Die CPU Last steigt bei dem kleinen Demo Programm nicht merklich an. Sie
schwankt bei 5%-7% aber auch ohne das Programm
Ben S. schrieb:> das Eventgesteuerte will ich eigentlich behalten, da ich nicht immer> solche schnellen Datensatzwiederholungen erwarte. es könnte auch mal> eine stunde pause sein und dann gehts wieder los...
ja und? Dann blockiert das read ebend 30min - was stört dich daran?
Sebastian S. schrieb:> 500 K Baud sollte jeder normale, heutige Rechner mit links können.> Also geh‘ mal davon aus, dass es an anderer Stelle hakt.
kann er ja, es gehen keine Daten verloren wie er schreibt.
Ist es möglich, dass das ganze "normal" ist?
Bei Fenster und ähnlichen Betriebssystemen ist es "normal", wenn das
Programm mal eine Pause einlegt.
Z.B. um Deine Neugierde (Bildschirm) zu befriedigen.
Da in diesen Pausen weiterhin Daten anfallen, ist es schon möglich, dass
diese vorübergehend in den "unter" dem Betriebssystem liegenden Puffern
rumhängen, um dann mit "Copy im RAM"-Geschwindigkeit einzutrudeln.
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.