Hola amigos mi problema es el siguiente
tengo una aplicación que lee un puerto serial que conecta a un micro controlador
al cual le puedo preguntar y el me devuelve una respuesta dependiendo de lo que
le pregunte. todo este proceso es automático lo cual ya lo puedo hacer
el micro gestiona varios dispositivos de la misma clase los cuales se enumeran según el orden cada dispositivo tiene un estado los cuales debo leer seguidamente por el
mismo puerto y aquí es donde se complica el asunto pues al mandar las preguntas
solo me toma una y al leerla me toma la ultima he tratado con hilos pero no estoy muy diestro en el tema ademas tengo funciones con parámetros que los hilos no me aceptan les agradecería si me ayudaran con alguna sugerencia
de paso coloco el código para que lo chequeen
Esto se hacheco con dos dispositivos conectados
Gracias por sus Respuestas
Código visual basic:
Ver original'importo las librerias necesarias para trabajar
Imports System.IO
Imports System.Text
Imports System.Threading
Public Class Form1
Dim comandos, comandos1 As String
Dim sEnter As New String(ChrW(13), 1)
Dim EstadoSurtidor As New comandos
Dim Respuesta As String
Public Delegate Sub delegado(ByVal str As String)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'inicio el puerto con el que me comunico
With SerialPort1
.BaudRate = "9600"
.StopBits = IO.Ports.StopBits.One
.PortName = "COM9"
.Parity = Ports.Parity.None
.DataBits = 8
.RtsEnable = False
.DtrEnable = False
End With
SerialPort1.Open()
'pregunto el estado de los dispositivos
SerialPort1.Write("ST01" & sEnter)
SerialPort1.Write("ST02" & sEnter)
End Sub
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
car1()
End Sub
'procedimiento para para tomar el dato que recivo del micro
Public Sub car1()
'pauso la respuesta para poder actualizar los controles de manera correcta
Thread.Sleep(1000)
Static strData As String = ""
strData = SerialPort1.ReadExisting()
If strData.IndexOf(Chr(13)) > 0 Then
Dim WriteInvoke As New delegado(AddressOf EnviarEstado1)
'invoco el delgado y paso el valor a signar
Me.Invoke(WriteInvoke, strData)
End If
End Sub
Private Sub EnviarEstado1(ByVal str As String)
Dim cont As Integer = 0
'comparo las respuestas del micro
If str = "OK" & sEnter Then
comandos = "ST01"
comandos1 = "ST02"
SerialPort1.Write(comandos & sEnter)
SerialPort1.Write(comandos1 & sEnter)
Else
If str <> "OK" & sEnter And str.Length <= 6 Then
comandos = str
'llamo a la clase que me gestina los estado
EstadoSurtidor.ComprobarEstado(comandos, SerialPort1)
'lleno un datagrid con los eventos del dispositivo
dtaevento.Rows.Insert(cont, Puerto.comandos.Estadosurtidor, DateString, Now.ToLongTimeString)
'dependiendo de las respuestas cambio la imagen
'y el texo a mostrar en la cabecera del groupcontrol
GroupControl1.Text = Puerto.comandos.titulo
pintura.ImageLocation = Puerto.comandos.ruta
Else
'sustraigo los valores que me interesan
' y los convierto a double para realizar ciertas operaciones
'que despues muestro en un textbox
Dim valor As String = str.Substring(26, 5)
Dim galones As String = str.Substring(11, 4)
Double.Parse(galones)
Double.Parse(valor)
Dim Gas As String = valor / galones
txtventa1.Text = valor
txtgalones1.Text = Gas.Substring(0, 4)
SerialPort1.Write("ST01" & sEnter)
SerialPort1.Write("ST02" & sEnter)
End If
End If
str = ""
cont = cont + 1
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
SerialPort1.Close()
Me.Close()
End Sub
End Class
Aca pongo la clase que compara los resultados que me devuelve el micro
Código Visual Basic:
Ver originalImports System.Text
Imports System.IO
Public Class comandos
Public Shared Estadosurtidor As String
Public Shared titulo As String
Public Shared ruta As String
'metetodo que me compara y me informa que dispositivo es
Public Sub ComprobarEstado(ByVal comandos As String, ByVal port As Object)
Dim estado As String
Dim cara As String
'dependiendo de las respuestas sustraigo el numero del dispositivo
'lo redirijo a la funcion que gestiona las respuestas
If comandos.Length <= 6 Then
estado = comandos.Substring(3, 2)
cara = comandos.Substring(1, 2)
If cara = "01" Then
estados(estado, cara, port)
Else
estados(estado, cara, port)
End If
Else
estado = comandos.Substring(0, 2)
cara = comandos.Substring(2, 2)
If cara = "01" Then
estados(estado, cara, port)
Else
estados(estado, cara, port)
End If
End If
End Sub
Public Sub estados(ByVal EstadoCara As String, ByVal cara As String, ByVal port As Object)
Dim sEnter As New String(ChrW(13), 1)
'estos son los caso de los estados dependiendo de este se genera una accion
Try
Select Case EstadoCara
Case "AR"
Estadosurtidor = "Autorizando Venta.." & cara
titulo = "En Espera"
ruta = "C:\Users\+++++\Documents\Visual Studio 2008\Projects\+++++\Puerto\Resources\08_settings_48.png"
port.Write("AU" & cara & sEnter)
Case "BY"
Estadosurtidor = "Venta en Proceso.." & cara
titulo = "Vendiendo"
ruta = "C:\Users\++++\Documents\Visual Studio 2008\Projects\+++++\Puerto\Resources\Untitled - 3.ico"
port.Write("ST" & cara & sEnter)
Case "RS"
Estadosurtidor = "Solicitando Resultados.." & cara
ruta = "C:\Users\+++++\Documents\Visual Studio 2008\Projects\+++++\Puerto\Resources\Untitled - 3.ico"
titulo = "Esperando el Resultado"
port.Write("RS" & cara & sEnter)
Case "SY"
Estadosurtidor = "En Reposo.." & cara
titulo = "Estado de Reposo"
ruta = "C:\Users\+++++\Documents\Visual Studio 2008\Projects\+++++\Puerto\Resources\08_settings_48.png"
port.Write("ST" & cara & sEnter)
Case Else
MsgBox("Error al Conectar Con El +++++")
End Select
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
End Class