Witam,
przyszło mi się zmierzyć pierwszy raz z napisaniem kodu VB.net do odczytu danych ze skanera kart poprzez Rs232.(więc jestem laikiem)
Przejrzałam z 50 forów i nie znalazłam rozwiązania mojego problemu, a znając życie rozwiązanie jest proste.
Mam skaner oraz kartę z zapisanym ID.
ID karty: E0040300014BB798 (chyba wartość w Hex skonwertowana na ASCII)
Skaner jest na pewno dobry, mam program do skanera i skanując kartę poprzez ten program zawsze odczytuje wartość karty: E0040300014BB798
Napisałam program w dwóch wariantach, skanowanie poprzez: SerialPort1.ReadExisting oraz skanowanie bitów: comPort.Read(byteBuffer, 0, bytecount) (ustawienia BaudRate 38400, DataBits - 8 - zgodnie z zaleceniami producenta skanera)
Problem polega na tym, że skanując tę samą kartę to za każdym razem program wyświetla mi inne dane :
Kod:
Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
ReceivedText(SerialPort1.ReadExisting)
End Sub
Private Sub ReceivedText(ByVal [text] As String)
If Me.TextBox1.InvokeRequired Then
Dim x As New sendtextboxcallback(AddressOf ReceivedText)
Me.Invoke(x, New Object() {(text)})
Else
Me.TextBox1.Text &= ([text])
End If
End Sub
Kilka odczytów ze skanera:
E0a?4F&I??G?
?E00??4F&?????
?E0??4F&?????
E00q?4F&I??G?
?E0??4F&I??N?
?E0a?4F&I??N?
?E00q?4F&?????
?E0A?4F&R??N?
?E0a?4F&????
Wiem, że odczyt jest nie skonwertowany ale czy nie powinien być za każdym razem taki sam ?
Stosując wczytywanie po bytes :
Private Sub comPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles comPort.DataReceived
Dim str As String = ""
If e.EventType = SerialData.Chars Then
Do
Dim bytecount As Integer = comPort.BytesToRead
If bytecount = 0 Then
Exit Do
End If
Dim byteBuffer(bytecount) As Byte
ReceivedText(comPort.Read(byteBuffer, 0, bytecount))
Loop
End If
RaiseEvent ScanDataRecieved(str)
End Sub
Private Sub ReceivedText(ByVal [text] As String)
If Me.TextBox1.InvokeRequired Then
Dim x As New sendtextboxcallback(AddressOf ReceivedText)
Me.Invoke(x, New Object() {(text)})
Else
Me.TextBox1.Text &= "_" & [text]
End If
End Sub
Otrzymuje:
_2_18_2_18_2_18_2_18_1_1_18_2_18_2_18_2_18_2_18_2_18_2_17_19_20_2_18_2_18_1_2_17_2_18_2_18_2_18
Zapewne nie wczytuje wszystkich informacji podczas jednorazowego skanowania, stąd takie odczyty.
ReadtimeOut ustawiłam na 200, chociaż wątpię żeby to miało znaczenie...
Proszę o pomoc, będą wdzięczna za uwagi, sugestię.