| |
![zurück](../images/b_zurueck.gif)
VB.NET - FortgeschritteneSerialPort -- Puffer löschen klappt nicht so wie gewünscht | | ![](../images/trans.gif) | Autor: DomiS | Datum: 16.01.06 10:08 |
| Hallo,
weiter unten könnt ihr einen Code-Ausschnitt zum Thema der neuen .NET 2.0 Klasse System.IO.Ports sehen. Ich benutze dort einen SerialPort und Frage in der Main in einer Endlosschleife den Event ab, ob Daten am seriellen Port bereitstehen.
Das klappt auch soweit ganz gut, mit den Sleeps bekomme ich genau die Abstände, dass bei mir alles in richtigen Bahnen verläuft.
Mein Problem ist jedoch folgendes:
Da die Daten gepuffert werden und mein serieller RFID-Reader konstant Daten übermittelt, sobald sich ein RFID-Chip im Empfangsbereich befindet, muss ich den Puffer jedesmal löschen. Wenn ich dann die anstehenden Bytes abfrage, dann bekomme ich 0 zurückgeliefert, also ist der Puffer auch wirklich leer!
Allerdings springt der Event bei mir trotzdem immer ein zweites Mal an. Den Grund dafür kenne ich leider nicht. Im Endeffekt bekomme ich also 2 mal die Methode port_DataReceived ausgeführt, obwohl ich sie ja nur einmal ausgeführt haben will und dafür ja extra den Puffer leeren lasse!
Deswegen habe ich die bool-Variable zweiterversuch eingeführt. Sollte diese True sein, also ein zweiter Durchlauf der Methode vorliegen, so soll die Sub-Methode abgebrochen werden. Allerdings lande ich bei diesem harten Vorgehen dann wieder in der Main mit der Endlosschleife und auf den Event, dass serielle Daten anstehen, wird überhaupt nichtmehr reagiert. Das ist natürlich NICHT in meinem Sinne, ich wollte ja blos den ominösen 2. Durchlauf verhindern!
Vielleicht hat ja jemand von Euch eine Idee, danke!
Imports System.IO.Ports
Module Module1
Public Delegate Sub SerialDataReceivedEventHandler(ByVal sender As Object, _
ByVal e As SerialDataReceivedEventArgs)
Public Event DataReceived As SerialDataReceivedEventHandler
Dim port As New SerialPort("COM1", 9600, Parity.None, 8, StopBits.One)
Dim zweitversuch As Boolean = False
Sub Main()
' Handler anlegen und registrieren
Dim handler As System.IO.Ports.SerialDataReceivedEventHandler = _
AddressOf port_DataReceived
AddHandler port.DataReceived, handler
' Endlos-Schleife starten, Event wird ggf. aktiv und verarbeitet die ID
' weiter
port.Open()
While (True)
Threading.Thread.Sleep(100)
Console.WriteLine("Main!")
End While
port.Close()
End Sub
Sub port_DataReceived(ByVal sender As Object, ByVal e As _
SerialDataReceivedEventArgs)
' die zweite Ausgabe verhindern
If zweitversuch Then Exit Sub
' Array von 0 bis 12, also mit 13 Stellen
Dim ausgabe As Char() = New Char(12) {}
Dim id As Char() = New Char(9) {}
' 25ms warten, um (zumindest auf diesem Rechner) die gewünschte 13Byte
' Übertragung zu erreichen!
' 13Byte über eine 9600bit/s Leitung brauchen eben seine Zeit!
Threading.Thread.Sleep(25)
' Daten am COM-Port lesen
Console.WriteLine("Getting Data")
port.Read(ausgabe, 0, 13)
' (Steuer-)Zeichen Nummer 1,2 und 13 abschneiden (index 0,1 und 12 aus
' dem Array)
For i As Integer = 2 To ausgabe.Length - 2
id(i - 2) = ausgabe(i)
Next
' Ausgabe der 10-stelligen ID
Console.WriteLine("Ausgabe: ")
Console.WriteLine(id)
' übermittelte ID weiterverarbeiten, also in der DB checken usw. (
' momentan deaktiviert, erstmal soll der Rest funktionieren, bevor ID
' weiterverarbeitet wird!)
'id_check(id)
' InBuffer löschen + Wartezeit, so dass nicht immerzu der Event
' anspringt
port.DiscardInBuffer()
Console.WriteLine("BytesToRead: " & port.BytesToRead)
Threading.Thread.Sleep(5000)
' zweiter Versuch signalisieren
If zweitversuch Then
zweitversuch = False
Else
zweitversuch = True
End If
End Sub
End Module Die Ausgabe auf der Konsole schaut dann wie folgt aus:
Main!
Main!
Main!
Main!
Getting Data
Ausgabe:
21D9A4A02E
BytesToRead: 0
Main!
Main!
Main!
Main!
Allerdings springt er ab diesem Zeitpunkt jetzt NIE mehr in die Event-Methode, mein Programm verharrt also in der Main und ist damit nutzlos.
Wenn ich diese Sache mit dem 2. Versuch weglassen, dann schaut die Ausgabe so aus, dass die Sachen doppelt ausgegeben werden, also so:
Main!
Main!
Getting Data
Ausgabe:
21D9A4A02E
BytesToRead: 0
Getting Data
Ausgabe:
21D9A4A02E
BytesToRead: 0
Main!
Main! | ![](../images/trans.gif) |
![](../images/48x48/info.gif) | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
![nach oben](../images/b_top.gif) ![zurück](../images/b_zurueck.gif) |
|
Neu! sevEingabe 3.0 ![Das Eingabecontrol der Superlative](../images/werbung/sevein20_100x100.jpg)
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats Access-Tools Vol.1 ![Access-Tools CD Vol.1](../images/werbung/apvol1_68x100.gif)
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|