Hallo mein Problem ist das ich wenn ich in C# ein Projekt mit COM-Schnittstelle 115200 Baud einstelle nur max alle 15 ms einen neuen Wert schicken kann, so das dieser aktuelle ist. Wenn ich schneller vom Mikrocontroller sende staut es sich irgendwann trotz Datatreceived event obwohl der Comport dir ganze Zeit geöffnet ist. Bei einem Bekannten läuft das programm ohne Probleme. Bei mir Zeigt das C#programm maximal 10 empfangene Daten pro Sekunde, obwohl ich bei Hterm 400 mal die Daten gesendet bekomme. private void COMPORT_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { Einlesen = COMPORT.ReadLine(); empfangen++; } catch { ; } }
teste mal ohne events. Beim einen event solle man so lange lesen bis nichts mehr kommt. du liest aber nur eine Zeile. Wenn jetzt merh im Puffer ist dann kommt auch kein Event mehr.
Das geht aber bei nem Bekannten haben mal probiert wer am schnellsten senden kann. Als meins nicht besonders schnell ging hat er mein Programm mal bei sich probiert und hab auch da die 400 Datensätze geschickt und angezeigt bekommen
Peter schrieb: > Das geht aber bei nem Bekannten haben mal probiert wer am schnellsten > senden kann. Als meins nicht besonders schnell ging hat er mein Programm > mal bei sich probiert und hab auch da die 400 Datensätze geschickt und > angezeigt bekommen Wenn es irgendwo geht und woanders nicht liegt es meist an der Fehlerhaften software! Was ist wenn nach dem Event keine Zeilenende kommt? dann blockiert dein Programm. Was ist wenn die Daten zu schnell kommen und 2 Zeilen im Puffer sind und nur ein event kommt?
Ich schicke vom Mikrocontroller einen String, an jedem String hänge ich ein Endzeichen an, was ich auch bei Hterm als Zeilenumbruch angezeigt bekomme und da kommen die 400 Daten auch ohne Probleme an ohne fehler.
Peter schrieb: > Ich schicke vom Mikrocontroller einen String, an jedem String hänge ich > ein Endzeichen an, was ich auch bei Hterm als Zeilenumbruch angezeigt > bekomme und da kommen die 400 Daten auch ohne Probleme an ohne fehler. und was ist wenn jemand das Kabel abzieht? ändere deinen code oder lass es wenn du es besser weist.
Das sollte nicht so gemeint sein das ich das nicht ändern will. Ich will nur nachvollziehen und verstehen. Gleiche Software mit gleichem Controller läuft ja auf anderer Hardware. Nur bei mir eben nicht. Der Nachteil ist doch das der Controller im prog dann immer solange wartet bis der PC-Empfangsbereit ist. Dadurch geht mir viel perfomance verloren.
dann ändere doch estmal das was ich geschrieben habem, eventuell hilft es ja was und dann wird dir auch klar warum das so ist. In dem Event muss du alles Lesen was da ist nicht nur eine Zeile.
Peter schrieb: > Gleiche Software mit gleichem > Controller läuft ja auf anderer Hardware. Nur bei mir eben nicht. Der > Nachteil ist doch das der Controller im prog dann immer solange wartet > bis der PC-Empfangsbereit ist. Dadurch geht mir viel perfomance > verloren. Das kann schon alleine an unterschiedlich großen Puffern (Treiber, Hardware, etc.) liegen. Wie bereits gesagt bei Events auf jedenfall alle vorliegenden Daten lesen bevor man den Event-Handler verlässt. Ich persönlich bevorzuge Thread + SerialPort ohne Events, aber das ist Geschmackssache. Wenn es um hohen Durchsatz geht (oder generell) vielleicht auch mal über USB nachdenken...
Hi Ich bin fertig mit einem Windows 7 Hyperterminal mit Plugin-System. Das funktioniert sehr gut. Dabei würde ich in Deinem Fall prüfen, wie gross der
1 | SerialCommPort1.BytesToRead |
ist. Das Lesen über das DataReceived Event würde ich da aussen vor lassen. Ich würde, wenn der BytesToRead Count korrekt ist, über
1 | SerialCommPort1.Read(Byte(), Int32, Int32) |
arbeiten. http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx lg Timo
Peter schrieb: > schicken kann Gucke mal ob du die Methode Flush() hast- damit jagst du alles aus dem Puffer raus. Kann sein, dass das dir probleme macht
Hallo also habe es mal ohne Event Versucht, bzw mit Einlesen = COMPORT.ReadExisting(); Passt auch soweit aber dann gehen ja auch viele Daten verloren. Will eine möglichst hohe Datenrate erreichen. Bin da eigentlich nur durch den Mikrocontroller begrenzt. Thread hab ich schon gehört. Würde aber auch gerne zählen lassen wie oft die Daten angekommen sind (und Fehlerhaft ausgelesen wurden).
Teste erstmal ohne events. einfach eine entlos schleife machen und daten empfangen while( true ) { string Einlesen = COMPORT.ReadExisting(); System.Diagnostig.Console.Write( Einlesen ); }
Wie gesagt hab jetzt ohne Events getestet das klappt ohne Probleme. Lese jetzt auch den ganzen Buffer aus.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.