Foros del Web » Programación para mayores de 30 ;) » .NET »

Ayuda con puerto serial

Estas en el tema de Ayuda con puerto serial en el foro de .NET en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 26/07/2010, 16:36
 
Fecha de Ingreso: octubre-2009
Ubicación: Barranquilla,Colombia
Mensajes: 19
Antigüedad: 15 años, 1 mes
Puntos: 0
Ayuda con puerto serial

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
  1. 'importo las librerias necesarias para trabajar
  2. Imports System.IO
  3. Imports System.Text
  4. Imports System.Threading
  5. Public Class Form1
  6.     Dim comandos, comandos1 As String
  7.     Dim sEnter As New String(ChrW(13), 1)
  8.     Dim EstadoSurtidor As New comandos
  9.     Dim Respuesta As String
  10.     Public Delegate Sub delegado(ByVal str As String)
  11.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  12.         'inicio el puerto con el que me comunico
  13.         With SerialPort1
  14.             .BaudRate = "9600"
  15.             .StopBits = IO.Ports.StopBits.One
  16.             .PortName = "COM9"
  17.             .Parity = Ports.Parity.None
  18.             .DataBits = 8
  19.             .RtsEnable = False
  20.             .DtrEnable = False
  21.         End With
  22.         SerialPort1.Open()
  23.         'pregunto el estado de los dispositivos
  24.         SerialPort1.Write("ST01" & sEnter)
  25.         SerialPort1.Write("ST02" & sEnter)
  26.     End Sub
  27.  
  28.     Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
  29.         car1()
  30.     End Sub
  31.     'procedimiento para para tomar el dato que recivo del micro
  32.     Public Sub car1()
  33.         'pauso la respuesta para poder actualizar los controles de manera correcta
  34.         Thread.Sleep(1000)
  35.         Static strData As String = ""
  36.         strData = SerialPort1.ReadExisting()
  37.         If strData.IndexOf(Chr(13)) > 0 Then
  38.             Dim WriteInvoke As New delegado(AddressOf EnviarEstado1)
  39.             'invoco el delgado  y paso el valor a signar
  40.             Me.Invoke(WriteInvoke, strData)
  41.         End If
  42.     End Sub
  43.     Private Sub EnviarEstado1(ByVal str As String)
  44.         Dim cont As Integer = 0
  45.         'comparo las respuestas del micro
  46.         If str = "OK" & sEnter Then
  47.             comandos = "ST01"
  48.             comandos1 = "ST02"
  49.             SerialPort1.Write(comandos & sEnter)
  50.             SerialPort1.Write(comandos1 & sEnter)
  51.         Else
  52.             If str <> "OK" & sEnter And str.Length <= 6 Then
  53.                 comandos = str
  54.                 'llamo a la clase que me gestina los estado
  55.                 EstadoSurtidor.ComprobarEstado(comandos, SerialPort1)
  56.                 'lleno un datagrid con los eventos del dispositivo
  57.                 dtaevento.Rows.Insert(cont, Puerto.comandos.Estadosurtidor, DateString, Now.ToLongTimeString)
  58.                 'dependiendo de las respuestas cambio la imagen
  59.                 'y el texo a mostrar en la cabecera del groupcontrol
  60.                 GroupControl1.Text = Puerto.comandos.titulo
  61.                 pintura.ImageLocation = Puerto.comandos.ruta
  62.             Else
  63.                 'sustraigo los valores que me interesan
  64.                 ' y los convierto a double para realizar ciertas operaciones
  65.                 'que despues muestro en un textbox
  66.                 Dim valor As String = str.Substring(26, 5)
  67.                 Dim galones As String = str.Substring(11, 4)
  68.                 Double.Parse(galones)
  69.                 Double.Parse(valor)
  70.                 Dim Gas As String = valor / galones
  71.                 txtventa1.Text = valor
  72.                 txtgalones1.Text = Gas.Substring(0, 4)
  73.                 SerialPort1.Write("ST01" & sEnter)
  74.                 SerialPort1.Write("ST02" & sEnter)
  75.             End If
  76.         End If
  77.         str = ""
  78.         cont = cont + 1
  79.  
  80.     End Sub
  81.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
  82.         SerialPort1.Close()
  83.         Me.Close()
  84.     End Sub
  85. End Class
Aca pongo la clase que compara los resultados que me devuelve el micro
Código Visual Basic:
Ver original
  1. Imports System.Text
  2. Imports System.IO
  3. Public Class comandos
  4.  
  5.     Public Shared Estadosurtidor As String
  6.     Public Shared titulo As String
  7.     Public Shared ruta As String
  8.     'metetodo que me compara y me informa que dispositivo es
  9.     Public Sub ComprobarEstado(ByVal comandos As String, ByVal port As Object)
  10.         Dim estado As String
  11.         Dim cara As String
  12.         'dependiendo de las respuestas sustraigo el numero del dispositivo
  13.         'lo redirijo a la funcion que gestiona las respuestas
  14.         If comandos.Length <= 6 Then
  15.             estado = comandos.Substring(3, 2)
  16.             cara = comandos.Substring(1, 2)
  17.             If cara = "01" Then
  18.                 estados(estado, cara, port)
  19.  
  20.             Else
  21.                 estados(estado, cara, port)
  22.             End If
  23.         Else
  24.             estado = comandos.Substring(0, 2)
  25.             cara = comandos.Substring(2, 2)
  26.             If cara = "01" Then
  27.                 estados(estado, cara, port)
  28.             Else
  29.                 estados(estado, cara, port)
  30.             End If
  31.         End If
  32.     End Sub
  33.     Public Sub estados(ByVal EstadoCara As String, ByVal cara As String, ByVal port As Object)
  34.         Dim sEnter As New String(ChrW(13), 1)
  35.         'estos son los caso de los estados dependiendo de este se genera una accion
  36.         Try
  37.             Select Case EstadoCara
  38.                 Case "AR"
  39.                     Estadosurtidor = "Autorizando Venta.." & cara
  40.                     titulo = "En Espera"
  41.                     ruta = "C:\Users\+++++\Documents\Visual Studio 2008\Projects\+++++\Puerto\Resources\08_settings_48.png"
  42.                     port.Write("AU" & cara & sEnter)
  43.                 Case "BY"
  44.                     Estadosurtidor = "Venta en Proceso.." & cara
  45.                     titulo = "Vendiendo"
  46.                     ruta = "C:\Users\++++\Documents\Visual Studio 2008\Projects\+++++\Puerto\Resources\Untitled - 3.ico"
  47.                     port.Write("ST" & cara & sEnter)
  48.                 Case "RS"
  49.                     Estadosurtidor = "Solicitando Resultados.." & cara
  50.                     ruta = "C:\Users\+++++\Documents\Visual Studio 2008\Projects\+++++\Puerto\Resources\Untitled - 3.ico"
  51.                     titulo = "Esperando el Resultado"
  52.                     port.Write("RS" & cara & sEnter)
  53.                 Case "SY"
  54.                     Estadosurtidor = "En Reposo.." & cara
  55.                     titulo = "Estado de Reposo"
  56.                     ruta = "C:\Users\+++++\Documents\Visual Studio 2008\Projects\+++++\Puerto\Resources\08_settings_48.png"
  57.                     port.Write("ST" & cara & sEnter)
  58.                 Case Else
  59.                     MsgBox("Error al Conectar Con El +++++")
  60.             End Select
  61.         Catch ex As Exception
  62.             MsgBox(ex.Message)
  63.         End Try
  64.  
  65.     End Sub
  66. End Class

Etiquetas: puerto, serial
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:22.