LER TEXT BOX E ESCREVER NO SQL
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
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
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
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
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
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
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?
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?
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.
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.
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
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
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
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
Cara não entendi muito bem, tentei copiar e colar esse código mas da erro.
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...
Tópico encerrado , respostas não são mais permitidas