LER TEXT BOX E ESCREVER NO SQL

ROGERIOAZEVEDO 27/07/2012 11:20:50
#406712
O richtextbox recebe os dados de uma leitura de serial conforme o código abaixo:

Imports System
Imports System.ComponentModel
Imports System.Threading
Imports System.IO.Ports
Imports System.Data.SqlClient


Public Class Ponto

Dim myPort As Array [ô]Detecta as portas disponíveis
Delegate Sub SetTextCallback(ByVal [text] As String)

Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

[ô]CARREGA PARA A COMBOBOX AS PORTAS COM DISPONÍVEIS
myPort = IO.Ports.SerialPort.GetPortNames() [ô]Lista as portas disponíveis

cmbBaud.Items.Add(2400) [ô]Insere os dados no combo Baud Rate
cmbBaud.Items.Add(9600) [ô]Insere os dados no combo Baud Rate
cmbBaud.Items.Add(19200) [ô]Insere os dados no combo Baud Rate
cmbBaud.Items.Add(38400) [ô]Insere os dados no combo Baud Rate
cmbBaud.Items.Add(57600) [ô]Insere os dados no combo Baud Rate
cmbBaud.Items.Add(115200) [ô]Insere os dados no combo Baud Rate

For i = 0 To UBound(myPort)
cmbPort.Items.Add(myPort(i))
Next
cmbPort.Text = cmbPort.Items.Item(0) [ô]Set cmbPort text to the first COM port detected
cmbBaud.Text = cmbBaud.Items.Item(0) [ô]Set cmbBaud text to the first Baud rate on the list

btnDisconnect.Enabled = False [ô]Initially Disconnect Button is Disabled

End Sub

Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
SerialPort1.PortName = cmbPort.Text [ô]Set SerialPort1 to the selected COM port at startup
SerialPort1.BaudRate = cmbBaud.Text [ô]Set Baud rate to the selected value on

[ô]Other Serial Port Property
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.DataBits = 8 [ô]Abre nossa porta serial
SerialPort1.Open()

btnConnect.Enabled = False [ô]Disabilita o botão Conectar
btnDisconnect.Enabled = True [ô]Habilita o botão Conectar

End Sub

Private Sub btnDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisconnect.Click
SerialPort1.Close() [ô]Fecha nossa porta serial
btnConnect.Enabled = True
btnDisconnect.Enabled = False
End Sub

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
ReceivedText(SerialPort1.ReadExisting()) [ô]Automatically called every time a data is received at the serialPort
End Sub
Private Sub ReceivedText(ByVal [text] As String)
[ô]compares the ID of the creating Thread to the ID of the calling Thread
If Me.rtbReceived.InvokeRequired Then
Dim x As New SetTextCallback(AddressOf ReceivedText)
Me.Invoke(x, New Object() {(text)})
Else
Me.rtbReceived.Text &= [text]
End If
End Sub

Private Sub cmbPort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbPort.SelectedIndexChanged
If SerialPort1.IsOpen = False Then
SerialPort1.PortName = cmbPort.Text [ô]pop a message box to user if he is changing ports
Else [ô]without disconnecting first.
MsgBox([Ô]Disconecte antes de alterar[Ô], vbCritical)
End If
End Sub

Private Sub cmbBaud_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBaud.SelectedIndexChanged
If SerialPort1.IsOpen = False Then
SerialPort1.BaudRate = cmbBaud.Text [ô]pop a message box to user if he is changing baud rate
Else [ô]without disconnecting first.
MsgBox([Ô]Disconecte antes de alterar[Ô], vbCritical)
End If
End Sub
KERPLUNK 27/07/2012 11:28:58
#406714
No método abaixo, é onde os dados que vem da placa são colocados no richtextbox:
Private Sub ReceivedText(ByVal [text] As String)
[ô]compares the ID of the creating Thread to the ID of the calling Thread
If Me.rtbReceived.InvokeRequired Then
Dim x As New SetTextCallback(AddressOf ReceivedText)
Me.Invoke(x, New Object() {(text)})
Else
Me.rtbReceived.Text &= [text] [ô]<--nessa linha, adiciona o que veio da porta para o textbox.
[ô] e também aqui que você deveria colocar o código para gravar no banco e depois adicionar no grid. De preferência, coloque aqueles procedimentos em métodos separados e
[ô]só chame esses métodos aqui
End If
End Sub
ROGERIOAZEVEDO 27/07/2012 14:51:22
#406725
Cara, infelizmente não deu certo ou não saquei como escrever corretamente o código. Lhe farei a ultima pergunta e encerrarei o tópico. Seria possível buscar a informação que será escrita na textbox e retornar da forma abaixo?

2012/07/26 10:27 System Area Access granted on door User Code 16
2012/07/26 10:27 System Area Access granted on door Door 2

A placa de traz esse valor eu gostaria que o código pudesse ler a TEXTBOX e me retornar...

Data: Somente a data, pensei pela quantidade de dígitos 2012/07/26 (XXXXXXXXX) 9 digitos, mas aí teria na segunda linha a data novamente que eu não necessitaria;
Hora: o mesmo caso acima, não precisaria pegar o dado 2x (XXXXX) 5 digitos;
Usuario: Pegar a informação de 2 digitos que vem depois de User Code
Porta: Pegar a informação de 2 digitos que vem depois de Door




KERPLUNK 27/07/2012 15:18:20
#406730
Agora acho que entendi:
Para cada passada de cartão na máquina, são retornadas duas linhas, uma com os dados do usuário e outra com os dados da porta que ele passou, é isso?
ROGERIOAZEVEDO 27/07/2012 15:37:04
#406732
isso, eu preciso pegar essas 2 linhas e transforma-las em:


Data Hora Usuario Porta


Se eu conecto essa placa no PC via USB no Hyperterminal todas as vezes que um cartão é apresentado sai na serial 2 linhas, se continuarem passando o cartão vai sendo inserido mais 2 linhas e assim por diante como abaixo:


2012/07/26 10:27 System Area Access granted on door User Code 16
2012/07/26 10:27 System Area Access granted on door Door 2
2012/07/26 10:27 System Area Access granted on door User Code 16
2012/07/26 10:27 System Area Access granted on door Door 2
2012/07/26 10:27 System Area Access granted on door User Code 16
2012/07/26 10:27 System Area Access granted on door Door 2
2012/07/26 10:27 System Area Access granted on door User Code 16
2012/07/26 10:27 System Area Access granted on door Door 2

O problema é que não eu quero escrever no banco de dados sempre as 2 ultimas linhas. Pra tentar resolver isso coloquei uma função pra apagar tudo aí terei na TEXTBOX somente as 2 novas linhas.

Outro problema é que no Hyperterminal as 2 linhas vem sempre uma abaixo da outra, não sei poque raios na minha aplicação de leitura de serial as vezes ele salta uma linha como por exemplo abaixo:


2012/07/26 10:27 System Area Access granted on door User Code 16
2012/07/26 10:27 System Area Access granted on door Door 2

2012/07/26 10:27 System Area Access granted on door User Code 16
2012/07/26 10:27 System Area Access granted on door Door 2
2012/07/26 10:27 System Area Access granted on door User Code 16

2012/07/26 10:27 System Area Access granted on door Door 2
2012/07/26 10:27 System Area Access granted on door User Code 16
2012/07/26 10:27 System Area Access granted on door Door 2

2012/07/26 10:27 System Area Access granted on door User Code 16
2012/07/26 10:27 System Area Access granted on door Door 2

Por isso perguntei se tem como remover as malditas linhas vazias, pois se não o subscript que busca fixo do caracter (0 ao 10) não encontrará nada nessa maldita linha em branco. Muito obrigado novamente pelo auxilio.
ROGERIOAZEVEDO 27/07/2012 15:39:38
#406733
Em anexo o código completo

Não sei por que essa caceta pula linha. Abaixo por exemplo um caso onde o acesso é negado, vem da placa apenas uma linha, no Hyperterminal vem linha abixo de linha aqui na minha aplicação ele salta algumas linhas como abaixo:


2012/07/27 15:44 System Area Access denied User Code 8
2012/07/27 15:44 System Area Access denied User Code 8
2012/07/27 15:44 System Area Access denied User Code 8

2012/07/27 15:44 System Area Access denied User Code 8
2012/07/27 15:44 System Area Access denied User Code 8

2012/07/27 15:44 System Area Access denied User Code 8

2012/07/27 15:44 System Area Access denied User Code 8
2012/07/27 15:44 System Area Access denied User Code 8
2012/07/27 15:44 System Area Access denied User Code 8
KERPLUNK 27/07/2012 15:55:32
#406735
Veja se entende a idéia:

Private Sub ReceivedText(ByVal [text] As String)
[ô]compares the ID of the creating Thread to the ID of the calling Thread
If Me.rtbReceived.InvokeRequired Then
Dim x As New SetTextCallback(AddressOf ReceivedText)
Me.Invoke(x, New Object() {(text)})
Else
Me.rtbReceived.Text &= [text]
Dim ponto As Ponto = SplitResposta([text])
GravaPontoSql(ponto)
AddPontoGrid
End If
End Sub
Private Sub AddPontoGrid(RegistroPonto As Ponto)
Dim lista As List(Of Ponto) = tabela.DataSource
lista.Add(RegistroPonto)
tabela.DataSource = lista
End Sub
Private Function SplitResposta(Resposta As String) As Ponto
Dim texto As String[]
texto = Resposta.ToString().Split([ô][ô])
Ponto retorno = New Ponto
Dim data As String = Resposta[0].Substring(0, 10)
Dim hora As String = Resposta[0].Substring(12, 6)
Dim acesso As String = Resposta[1].Substring(33, 22)
Dim usuario As String = Resposta[1].Substring(58, 12)
Dim porta As String = Resposta[1].Substring(133, 12)
[ô]nota: esses parâmetros no substring, são o começo e o fim da parte do texto que se quer ler, talvez você tenha que ajustar isso
retorno.Data = data
retorno.Hora = hora
retorno.Acesso = acesso
retorno.Usuario = usuario
retorno.Porta = porta
SplitResposta = retorno

End Function
Private Sub GravaPontoSql(RegistroPonto As Ponto)
Dim Conn As New SqlConnection([Ô]Server = 180.000.000.000; Database = GSNDATA; integrated security = true[Ô])

Try
Conn.Open()
Catch ex As Exception
MessageBox.Show(ex.Message, [Ô]Falha na conexão SQL[Ô])

End Try
If Conn.State = 1 Then
Me.Text = [Ô]Sistema Conectado ao DB GSNDATA[Ô]
Me.BackColor = Color.CadetBlue()
End If
Dim SQL As String = [Ô]INSERT INTO _Ponto_GSN([data], [hora], [acesso], [usuario], [porta]) VALUES (@data, @hora, @acesso, @usuario, @porta);[Ô]
Dim cmd As New SqlCommand(SQL, Conn)
cmd.Parameters.AddWithValue([Ô]@data[Ô], RegistroPonto.Data)
cmd.Parameters.AddWithValue([Ô]@hora[Ô], RegistroPonto.Hora)
cmd.Parameters.AddWithValue([Ô]@acesso[Ô], RegistroPonto.Acesso)
cmd.Parameters.AddWithValue([Ô]@usuario[Ô], RegistroPonto.Usuario)
cmd.Parameters.AddWithValue([Ô]@porta[Ô], RegistroPonto.Porta)
cmd.ExecuteNonQuery()
End Sub
ROGERIOAZEVEDO 27/07/2012 16:34:22
#406738
Cara não entendi muito bem, tentei copiar e colar esse código mas da erro.
KERPLUNK 27/07/2012 16:39:39
#406740
Muito provavelmente o erro deve ser relativo ao método [Ô]ReceivedText[Ô] já existir. Ele deve ser sobreposto por este que está aí... além disso é uma noção do que fazer, estude o que o código faz, entenda o que está acontecendo, não simplesmente copie e cole...
Página 3 de 3 [29 registro(s)]
Tópico encerrado , respostas não são mais permitidas