none
Como ler lados de um leitor de cheques ou código de barras através da porta serial

    Question

  • Olá pessoal, Boa tarde!

    Gostaria de saber como eu faço para ler dados de um leitor de cheques ou códigos de barras que esta numa porta serial (COM1)?

    Eu pesquisei, e pesquisei na net e encontrei o seguinte código:

    'DECLARO A VARIAVEL QUE RECEBE OS DADOS DA PORTA
    Dim SerialPort As IO.Ports.SerialPort = New IO.Ports.SerialPort("COM1", 9600, IO.Ports.Parity.None, 8, IO.Ports.StopBits.One)
         
    'DECLARO A VARIAVEL QUE RECEBERÁ O DADO LIDO
    Dim resultado As New String("")
    'ABRE A CONEXÃO COM A PORTA
     SerialPort.Open()
    'PASSA OS DADOS PARA VARIAVEL
     resultado = SerialPort.ReadLine
     
    'FECHA A CONEXÃO COM A PORTA
    SerialPort.Close()
    'JOGA NUMA TEXT BOX
    txt_resultado.text = resultado

    Porém, quando eu executo o código : resultado= SerialPort.ReadLine, o programa fica travado e não envia ou recebe nada !!!

    Aguém pode me ajudar, Desde já. Vlw


    **** SER A RESPOSTA FOR UTIL, NÃO ESQUEÇA DE MARCA-LÁ =P ****

    Thursday, March 08, 2012 6:55 PM

Answers

  • A resposta tá certa pois faz uma verificação do código, mais muitos leitores possuem já essa verificação, principalmente com os leitores seriais!

    Eles veem com uns cartões de configuração onde você define quais os códigos que ele poderá lê, quando der erro oque fazer, velocidade da comunicação, entre outros!

    Agora depois de um pouco mais de pesquisa, eu encontrei a solução:

    'IMPORTAÇÕES DE BIBLIOTECAS PARA LEITORA DE CHEQUE SERIAL
    Imports System.IO.Ports
    Imports System.Runtime.Remoting.Messaging
    Public Class frm_localizar_cheque
    'VARIAVEL PARA CRIAÇÃO DA PORTA SERIAL
    Dim SerialPort As New IO.Ports.SerialPort
    'FUNÇÃO PARA DEFINIR A PORTA DE COMUNICAÇÃO, VELOCIDADE E ETC..
    Private Sub definirDadosLeitoraCheque(ByVal porta As String, ByVal bits_segundo As Integer, ByVal bits_dados As Integer, ByVal paridade As String, ByVal bits_parada As String, ByVal controle_fluxo As String)
          
    'DEFINE OS VALORES 
     SerialPort.PortName = porta  'PORTA DE COMUNICACAO
     SerialPort.BaudRate = bits_segundo 'BITS POR SEGUNDO
            'PARIDADE
            If paridade = "Even" Then
                SerialPort.Parity = Parity.Even
            ElseIf paridade = "Odd" Then
                SerialPort.Parity = Parity.Odd
            ElseIf paridade = "Nenhum" Then
                SerialPort.Parity = Parity.None
            ElseIf paridade = "Mark" Then
                SerialPort.Parity = Parity.Mark
            ElseIf paridade = " Space" Then
                SerialPort.Parity = Parity.Space
            End If
            'BITS DE DADOS
            SerialPort.DataBits = bits_dados
            'BITS DE PARADA
            If bits_parada = "1" Then
                SerialPort.StopBits = StopBits.One
            ElseIf bits_parada = "1,5" Then
                SerialPort.StopBits = StopBits.OnePointFive
            ElseIf bits_parada = "2" Then
                SerialPort.StopBits = StopBits.Two
            Else
                SerialPort.StopBits = StopBits.None
            End If
            'CONTROLE DE FLUXO
            If controle_fluxo = "XON / XOFF" Then
                SerialPort.Handshake = Handshake.XOnXOff
            ElseIf controle_fluxo = "Hardware" Then
                SerialPort.Handshake = Handshake.RequestToSend
            ElseIf controle_fluxo = "Nenhum" Then
                SerialPort.Handshake = Handshake.None
            End If
        End Sub
    'ESSE É O MÉTODO QUE FALTOU EU COLOCAR NO MEU EXEMPLO, AQUI QUE COLOCAMOS O MÉTODO .READLINE()
    Private Sub DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
            Dim dado_recebido As String = ""
            dado_recebido = SerialPort.ReadExisting
            If dado_recebido.Length = 34 Then
                dado_recebido = dado_recebido.Replace(":", "Ç")
                txt_codigo_barras_cheque.Text = dado_recebido
                txt_codigo_barras_cheque.SelectAll()
                Dim tecla As New System.Windows.Forms.KeyEventArgs(Keys.Enter)
              
                txt_codigo_barras_cheque_KeyUp(sender, tecla)
               
                If SerialPort.IsOpen = True Then
                    SerialPort.DiscardInBuffer()
                    SerialPort.Close()
                End If
            End If
        End Sub
    'AO CARREGAR O FORM, INICIA UM TIMER PARA FAZER A VERIFICAÇÃO SE RECEBEU ALGUM DADO NOVO
     
    Private Sub frm_localizar_cheque_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            limparDados()
            txt_codigo_barras_cheque.Focus()
            txt_codigo_barras_cheque.Clear()
            lbl_mensagem_um.Visible = False
            'PEGA OS DADOS DA LEITORA DE CHEQUE PARA FAZER A POSSIVEL
            timer_serial.Start()
        End Sub
     Private Sub timer_serial_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer_serial.Tick
            
    'VERIFICA SE É SERIAL A CONEXÃO COM A LEITORA
     If txt_codigo_barras_cheque.TextLength >= 0 Then
     Try
         If SerialPort.IsOpen = False Then
                            With Me.dgv_config_leitora_cheque.CurrentRow
                                definirDadosLeitoraCheque(.Cells(2).Value.ToString, CInt(.Cells(3).Value.ToString), _
                                                          CInt(.Cells(4).Value.ToString), .Cells(5).Value.ToString, .Cells(6).Value.ToString, _
                                                          .Cells(7).Value.ToString)
                            End With
                            SerialPort.Open()
                            SerialPort.DiscardInBuffer()
                        End If
                        If txt_codigo_barras_cheque.Focused = True Then
                            DataReceived(SerialPort, Nothing)
                        End If
     Catch ex As Exception
                        timer_serial.Stop()
                        msg_erro(ex.Message.ToString() + " - (''" + ex.GetType.ToString + "'')")
                    End Try
                End If
        End Sub
    No meu funcionou certinho, desde já vlw!!! Gente!!

    **** SER A RESPOSTA FOR UTIL, NÃO ESQUEÇA DE MARCA-LÁ =P ****

    Friday, March 16, 2012 7:15 PM

All replies

  • Olá Rafael!

    Creio que você precise primeiro tratar o CMC7 que identifica os caracteres das barras:

    Analise o link abaixo:

    http://social.msdn.microsoft.com/Forums/pt/vsvbasicpt/thread/9ec7ca0f-d321-4ac4-b17b-2816a882ce60  

    att;


    Eder Costa
    LATAM Forum Support Engineer
    Microsoft Corporation
    forumguys

    Tuesday, March 13, 2012 1:57 PM
  • A resposta tá certa pois faz uma verificação do código, mais muitos leitores possuem já essa verificação, principalmente com os leitores seriais!

    Eles veem com uns cartões de configuração onde você define quais os códigos que ele poderá lê, quando der erro oque fazer, velocidade da comunicação, entre outros!

    Agora depois de um pouco mais de pesquisa, eu encontrei a solução:

    'IMPORTAÇÕES DE BIBLIOTECAS PARA LEITORA DE CHEQUE SERIAL
    Imports System.IO.Ports
    Imports System.Runtime.Remoting.Messaging
    Public Class frm_localizar_cheque
    'VARIAVEL PARA CRIAÇÃO DA PORTA SERIAL
    Dim SerialPort As New IO.Ports.SerialPort
    'FUNÇÃO PARA DEFINIR A PORTA DE COMUNICAÇÃO, VELOCIDADE E ETC..
    Private Sub definirDadosLeitoraCheque(ByVal porta As String, ByVal bits_segundo As Integer, ByVal bits_dados As Integer, ByVal paridade As String, ByVal bits_parada As String, ByVal controle_fluxo As String)
          
    'DEFINE OS VALORES 
     SerialPort.PortName = porta  'PORTA DE COMUNICACAO
     SerialPort.BaudRate = bits_segundo 'BITS POR SEGUNDO
            'PARIDADE
            If paridade = "Even" Then
                SerialPort.Parity = Parity.Even
            ElseIf paridade = "Odd" Then
                SerialPort.Parity = Parity.Odd
            ElseIf paridade = "Nenhum" Then
                SerialPort.Parity = Parity.None
            ElseIf paridade = "Mark" Then
                SerialPort.Parity = Parity.Mark
            ElseIf paridade = " Space" Then
                SerialPort.Parity = Parity.Space
            End If
            'BITS DE DADOS
            SerialPort.DataBits = bits_dados
            'BITS DE PARADA
            If bits_parada = "1" Then
                SerialPort.StopBits = StopBits.One
            ElseIf bits_parada = "1,5" Then
                SerialPort.StopBits = StopBits.OnePointFive
            ElseIf bits_parada = "2" Then
                SerialPort.StopBits = StopBits.Two
            Else
                SerialPort.StopBits = StopBits.None
            End If
            'CONTROLE DE FLUXO
            If controle_fluxo = "XON / XOFF" Then
                SerialPort.Handshake = Handshake.XOnXOff
            ElseIf controle_fluxo = "Hardware" Then
                SerialPort.Handshake = Handshake.RequestToSend
            ElseIf controle_fluxo = "Nenhum" Then
                SerialPort.Handshake = Handshake.None
            End If
        End Sub
    'ESSE É O MÉTODO QUE FALTOU EU COLOCAR NO MEU EXEMPLO, AQUI QUE COLOCAMOS O MÉTODO .READLINE()
    Private Sub DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
            Dim dado_recebido As String = ""
            dado_recebido = SerialPort.ReadExisting
            If dado_recebido.Length = 34 Then
                dado_recebido = dado_recebido.Replace(":", "Ç")
                txt_codigo_barras_cheque.Text = dado_recebido
                txt_codigo_barras_cheque.SelectAll()
                Dim tecla As New System.Windows.Forms.KeyEventArgs(Keys.Enter)
              
                txt_codigo_barras_cheque_KeyUp(sender, tecla)
               
                If SerialPort.IsOpen = True Then
                    SerialPort.DiscardInBuffer()
                    SerialPort.Close()
                End If
            End If
        End Sub
    'AO CARREGAR O FORM, INICIA UM TIMER PARA FAZER A VERIFICAÇÃO SE RECEBEU ALGUM DADO NOVO
     
    Private Sub frm_localizar_cheque_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            limparDados()
            txt_codigo_barras_cheque.Focus()
            txt_codigo_barras_cheque.Clear()
            lbl_mensagem_um.Visible = False
            'PEGA OS DADOS DA LEITORA DE CHEQUE PARA FAZER A POSSIVEL
            timer_serial.Start()
        End Sub
     Private Sub timer_serial_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer_serial.Tick
            
    'VERIFICA SE É SERIAL A CONEXÃO COM A LEITORA
     If txt_codigo_barras_cheque.TextLength >= 0 Then
     Try
         If SerialPort.IsOpen = False Then
                            With Me.dgv_config_leitora_cheque.CurrentRow
                                definirDadosLeitoraCheque(.Cells(2).Value.ToString, CInt(.Cells(3).Value.ToString), _
                                                          CInt(.Cells(4).Value.ToString), .Cells(5).Value.ToString, .Cells(6).Value.ToString, _
                                                          .Cells(7).Value.ToString)
                            End With
                            SerialPort.Open()
                            SerialPort.DiscardInBuffer()
                        End If
                        If txt_codigo_barras_cheque.Focused = True Then
                            DataReceived(SerialPort, Nothing)
                        End If
     Catch ex As Exception
                        timer_serial.Stop()
                        msg_erro(ex.Message.ToString() + " - (''" + ex.GetType.ToString + "'')")
                    End Try
                End If
        End Sub
    No meu funcionou certinho, desde já vlw!!! Gente!!

    **** SER A RESPOSTA FOR UTIL, NÃO ESQUEÇA DE MARCA-LÁ =P ****

    Friday, March 16, 2012 7:15 PM