Hallo,
ich habe mir unter Zuhilfenahme eines freien VB Projektes ein kleines Programm geschrieben, welches mir die COM1 Schnittstelle öffnet an der ein Barcodescanner (Datalogic) angeschlossen ist. Beim ersten Scan wird auch ohne Fehler die Daten des Barcodes (in diesem Fall eine 8-stellige Nummer) eingelesen und in meinem Label angezeigt.
Scanne ich aber nun den nächsten Barcode, scheint dies zwar zu funktionieren aber es werden keine Daten mehr angezeigt. Wenn ich dann weitere Codes scanne (alle die gleiche Sorte) werden manchmal ein paar Zahlen daraus angezeigt, manchmal gar nichts. Erst wenn ich das Programm ganz neu starte, geht es wieder einmal.
Vielleicht findet da jemand von euch einen Fehler?! Die Einstellungen der COM Schnittstelle sind definitiv richtig, da wir dieses auch an unseren Maschinen nutzen, wo die Scanner eigentlich in Betrieb sind und dort die gleichen Codes lesen.
Hier der komplette Code:
Spoiler anzeigen
ich habe mir unter Zuhilfenahme eines freien VB Projektes ein kleines Programm geschrieben, welches mir die COM1 Schnittstelle öffnet an der ein Barcodescanner (Datalogic) angeschlossen ist. Beim ersten Scan wird auch ohne Fehler die Daten des Barcodes (in diesem Fall eine 8-stellige Nummer) eingelesen und in meinem Label angezeigt.
Scanne ich aber nun den nächsten Barcode, scheint dies zwar zu funktionieren aber es werden keine Daten mehr angezeigt. Wenn ich dann weitere Codes scanne (alle die gleiche Sorte) werden manchmal ein paar Zahlen daraus angezeigt, manchmal gar nichts. Erst wenn ich das Programm ganz neu starte, geht es wieder einmal.
Vielleicht findet da jemand von euch einen Fehler?! Die Einstellungen der COM Schnittstelle sind definitiv richtig, da wir dieses auch an unseren Maschinen nutzen, wo die Scanner eigentlich in Betrieb sind und dort die gleichen Codes lesen.
Hier der komplette Code:
VB.NET-Quellcode
- Public Class frm_main
- ' Das Delegat muss die selbe Signature haben
- Delegate Sub TextBoxCallback(ByVal text As String)
- Private WithEvents myComPort As IO.Ports.SerialPort
- ' Bei den meisten Geräten ist ein Abschlußzeichen erforderlich, meistens
- ' wird ChrW(13) oder ChrW(10) oder beide benötigt
- ' - Wählt was eure Gegenstelle benötigt:
- ' Private EndOfCommand As String = Constants.vbCr.ToString
- ' Private EndOfCommand As String = Constants.vbLf.ToString
- Private EndOfCommand As String = Constants.vbCrLf.ToString
- Private Sub frm_main_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
- 'COM Port beim Beenden schließen
- myComPort.Close()
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, _
- ByVal e As System.EventArgs) Handles MyBase.Load
- 'Initialisierung der COM Schnittstelle (in Klammern = gewünschter COM Port)
- opencom(0)
- End Sub
- Private Sub opencom(ByVal comport As Integer)
- ' Mal nachschauen, ob es hier SerialPorts gibt
- Dim str() As String = IO.Ports.SerialPort.GetPortNames()
- 'gefundene COM Ports anzeigen
- Dim port As String
- Dim gesamtport As String
- For Each port In str
- gesamtport = port
- Next port
- 'Anzeige öffnen
- 'MessageBox.Show("gefundene COM Ports: " & gesamtport, "Info", MessageBoxButtons.OK, MessageBoxIcon.Information)
- ' Wenn nein, dann beenden:
- If str.Length = 0 Then
- MessageBox.Show("Es wurden keine COM Ports gefunden!", "kein COM Port gefunden", MessageBoxButtons.OK, MessageBoxIcon.Information)
- slbl_status.Text = "keine COM Ports verfügbar!"
- End If
- ' Eine Instance von SerialPort erstellen
- ' Im Normalfall ist das COM1:
- myComPort = New IO.Ports.SerialPort(str(0))
- slbl_port.Text = "COM 1"
- 'Einstellungen der seriellen Schnittstelle setzen
- ' Die folgenden vier Einstellungen müssen denen der
- ' Gegenstelle entsprechen
- myComPort.BaudRate = 9600
- myComPort.DataBits = 8
- myComPort.StopBits = IO.Ports.StopBits.One
- myComPort.Parity = IO.Ports.Parity.None
- ' Wichtig! Hier wird eingestellt nach wieviel Bytes im Eingangspuffer
- ' das DataReceived Event gefeuert wird
- myComPort.ReceivedBytesThreshold = 1
- ' COM Port öffnen
- myComPort.Open()
- End Sub
- ' Wird ausgelöst wenn die Comm die in ReceivedBytesThreshold eingestellte Anzahl Bytes empfangen hat
- Private Sub myComPort_DataReceived( _
- ByVal sender As Object, _
- ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
- Handles myComPort.DataReceived
- Select Case e.EventType
- Case IO.Ports.SerialData.Chars
- ' Ein Zeichen wurde empfangen und im Eingabepuffer platziert.
- Case IO.Ports.SerialData.Eof
- ' Das Dateiendezeichen wurde empfangen und im
- ' Eingabepuffer platziert.
- End Select
- slbl_status.Text = "es wurden Daten empfangen..."
- Dim msg As String = myComPort.ReadExisting
- ShowText(msg)
- myComPort.DiscardOutBuffer()
- End Sub
- ' Wird ausgelöst wenn sich die Steuerleitungen geändert haben
- Private Sub myComPort_PinChanged(ByVal sender As Object, ByVal e As _
- System.IO.Ports.SerialPinChangedEventArgs) Handles myComPort.PinChanged
- Select Case e.EventType
- Case IO.Ports.SerialPinChange.Break
- ' Bei der Eingabe wurde ein "break" erkannt.
- Case IO.Ports.SerialPinChange.CDChanged
- ' Der Zustand des CD-Signals (Carrier Detect) hat sich geändert.
- ' Mit diesem Signal wird angezeigt, ob ein Modem mit einer
- ' Telefonleitung verbunden ist und ein Datenträgersignal
- ' erkannt wurde.
- Case IO.Ports.SerialPinChange.CtsChanged
- ' Der Zustand des CTS-Signals (Clear to Send) hat sich geändert.
- ' Mit diesem Signal wird angegeben, ob Daten über den seriellen
- ' Anschluss gesendet werden können.
- Case IO.Ports.SerialPinChange.DsrChanged
- ' Zustand des DSR-Signals (Data Set Ready) hat sich geändert.
- ' Mit diesem Signal wird angezeigt, ob das Gerät am seriellen
- ' Anschluss betriebsbereit ist.
- Case IO.Ports.SerialPinChange.Ring
- 'Ein Ringindikator wurde erkannt.
- End Select
- End Sub
- ''' Wird ausgelöst wenn ein Fehler in der Übertragung endeckt wurde
- Private Sub myComPort_ErrorReceived( _
- ByVal sender As Object, _
- ByVal e As System.IO.Ports.SerialErrorReceivedEventArgs) _
- Handles myComPort.ErrorReceived
- Select Case e.EventType
- Case IO.Ports.SerialError.Frame
- ' Die Hardware hat einen Rahmenfehler erkannt.
- slbl_status.Text = "Fehler: Rahmenfehler Hardware!"
- Case IO.Ports.SerialError.Overrun
- ' Ein Zeichenpufferüberlauf ist aufgetreten. Das nächste
- ' Zeichen geht verloren.
- slbl_status.Text = "Fehler: Überlauf, nächstes Zeichen geht verloren!"
- Case IO.Ports.SerialError.RXOver
- ' Ein Eingabepufferüberlauf ist aufgetreten.
- ' Die Kapazität des Eingabepuffers ist erschöpft,
- ' oder es wurde ein Zeichen nach dem Dateiendezeichen
- ' (EOF, end-of-file) empfangen.
- slbl_status.Text = "Fehler: Eingabepufferüberlauf!"
- Case IO.Ports.SerialError.RXParity
- ' Die Hardware hat einen Paritätsfehler erkannt.
- slbl_status.Text = "Fehler: Paritätsfehler!"
- Case IO.Ports.SerialError.TXFull
- ' Die Anwendung hat versucht, ein Zeichen zu übertragen, aber
- ' die Kapazität des Ausgabepuffers war erschöpft.
- slbl_status.Text = "Fehler: Kapazität Ausgabepuffer erschöpft!"
- End Select
- 'Im Textfeld anzeigen dass es einen Fehler gab
- ShowText("Fehler")
- End Sub
- ' Da die Daten aus einem anderem Thread kommen müssen wir die Ausgabe über Invoke machen
- Private Sub ShowText(ByVal text As String)
- If lbl_data.InvokeRequired Then
- Dim d As New TextBoxCallback(AddressOf ShowText)
- Invoke(d, New Object() {text})
- Else
- 'alten Text löschen
- lbl_data.Text = ""
- 'empfangenen Text in Textbox schreiben
- lbl_data.Text = text
- End If
- End Sub
- ' Hier wird der Command zusammengesetzt und versendet
- Private Sub Send(ByVal command As String)
- Me.myComPort.Write(command & Me.EndOfCommand)
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_exit.Click
- 'Me.Send("Ein Befehl, den die Gegenstelle kennt!")
- Application.Exit()
- End Sub
- Private Sub BeendenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles BeendenToolStripMenuItem.Click
- Application.Exit()
- End Sub
- Private Sub btn_exit_Click(sender As Object, e As EventArgs) Handles btn_exit.Click
- Application.Exit()
- End Sub
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- 'Label löschen
- lbl_data.Text = ""
- End Sub
- End Class
==> seid .net zueinander <==