Vb.net Rs232 mam za każdym razem inny odczyt.

0

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ę.

0

zajrzyj może na codeproject.com...

0

Tam, też szukałam...
Sama doszłam do tego jak to skanować poprawnie.
Wystarczyło usunąć: .ParityReplace
ustawić poprawny ReadTimeOut = 10, ReceivedBytesThreshold = 13 i parity na space.
do tego Baudrate 38400, stopbits = one
Jakby ktoś szukał to wydaje mi się, że to są specyficzne ustawienia skanerów FEIG ELECTRONICz frame 8E1
(2 Typy skanerów na tych sett. mi działają)
Pozdrawiam.

0

Witam,

Skanowanie mam już opanowane, ale mam pytanie dot. odczytu informacji o braku skanowania. To jest trudniejsze:)

Jak napisać funkcję która powie mi: "nie ma już nic do skanowania" ??

Skaner będzie skanował kod w sposób ciągły załóżmy co sekundę. Do skanera przykładam obiekt X do skanowania - co sekundę podaje mi info - Obiekt X jest pod skanerem.

  • teraz zabieram Obiekt X spod skanera - potrzebuje info, że produkt nie znajduje się już pod skanerem - skaner is free :)

Zdarzenie SerialPort.DataReceived - działa na zasadzie Incoming gdy skaner coś zeskanuje.

zwykłe sprawdzenie bitów na wejściu nie wystarczy:
dim a_check as integer
a_check = SerialPortTRLY.BytesToRead
If a_check = 0 Then MsgBox("koniec")

Jest jakaś prosta funkcja ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1