Wie man richtig mit SerialPort.DiscardInBuffer?
Ich habe eine Anwendung geschrieben, die liest von einem seriellen Gerät zu einem sehr schnellen rate. Der serielle port-Objekt jedoch nicht die Feuer der DataReceieved
Veranstaltung nach ca 20 min Dauerbetrieb. Trennen und erneutes verbinden des seriellen programmgesteuert ermöglicht die Veranstaltung wieder zu arbeiten, aber nur für weitere 20 min.
Versuchte ich mit DiscardInBuffer
nach jedem DataReceived
Ereignis und dieses hat offenbar das problem gelöst. Aber die Methode verbraucht viel cpu-Zeit und vermindert die performance der Anwendung. MSDN erwähnt, dass die Methode "Verwirft die Daten von der seriellen Treibers erhalten buffer.", aber nicht schlagen, wenn es verwendet werden soll.
Wann und wie sollte DiscardInBuffer
verwendet werden, und verwende ich es in den richtigen Kontext für mein spezielles problem ?
Edit:
Nach der Umsetzung der ErrorReceived
Ereignis, die Ereignis-Daten angegeben, die die zurückgegebenen event-Typ war ein "RXOver".
Nein, ich bin nicht. Was sollte ich Ausschau halten in den ErrorReceived Veranstaltung ?
InformationsquelleAutor steeppham | 2010-10-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach mehr Untersuchungen, es scheint, dass mein problem war mehr eine grundsätzliche Frage. Da die Daten überschwemmungen in bei einem heißen Tempo, das SerialPort-Puffer benötigt werden, gelöscht werden oder kontinuierlich verarbeitet, um zu verhindern, dass die "RXOver" Fehler. Ich erreichte dies durch das Lesen in einem anderen Puffer, die während der
DataReceived
Ereignis und verarbeitet es in einem anderen separaten thread.Aus meinem Verständnis der
DiscardInBuffer
sollte nur verwendet werden, selektiv zum löschen der Inhalt des ports für die Initialisierung Zwecke, wie vor dem öffnen einen port. Der Prozess der clearing-Treiber-Puffer hat einige Zeit in Anspruch nehmen und sollte daher sinnvoll genutzt werden, in eine performance-orientierte Anwendung.Wenn Sie versuchen, verwerfen Sie den Puffer, bevor der port geöffnet wurde, erhalten Sie eine Ausnahme "Der port ist geschlossen.". Der port muss geöffnet sein, um das verwerfen von Methoden.
InformationsquelleAutor steeppham
Zwei Ideen in den Sinn kommen. Die erste (schreckliche) Idee: rufen Sie
DiscardInBuffer
alle 15 bis 20 Minuten statt nach jedemDataReceived
Veranstaltung. Der zweite (etwas bessere) Idee: rufen SieDiscardInBuffer
wenn Sie erhalten dieErrorReceived
Veranstaltung, die Sie sollten in der Handhabung.InformationsquelleAutor Matthew Ferreira