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:
Aca pongo la clase que compara los resultados que me devuelve el microVer 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
Código Visual Basic:
Ver original
Imports 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