elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Envios y recibos de caracteres VB .net
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Envios y recibos de caracteres VB .net  (Leído 2,180 veces)
Meta


Desconectado Desconectado

Mensajes: 3.438



Ver Perfil WWW
Envios y recibos de caracteres VB .net
« en: 27 Febrero 2015, 08:44 am »



1)El programa espera la recepciòn de un ENQ(05 Hex) o STX(02 Hex)

2) Si recibo lo del paso 1 , le envìo un ACK(06 Hex)

3)Luego de enviado el ACK leo todo lo que me manda la maquina externa, si es distinto de cualquier caracter de control, lo muestro.

4) Si recibo un EOT(04 Hex) mando un enter en la pantalla de recepcion para diferenciar las lineas.

5) Si recibo un ETX(03 Hex) le respondo con un ACK.

Supongo que en este caso se podrìa hacer un if o un select preguntando lo recibido, el tema es que no se como leer de manera correcta y poder comparar que es lo que se recibio para poder ejecutar la tarea necesaria segun lo que llega.

Código
  1. Imports System.IO.Ports
  2. Imports System.Text
  3.  
  4. Public Class Form1
  5.    Dim recibidos As String
  6.    Dim stx As String = ASCIIEncoding.ASCII.GetString(New Byte() {2})
  7.    Dim etx As String = ASCIIEncoding.ASCII.GetString(New Byte() {3})
  8.    Dim eot As String = ASCIIEncoding.ASCII.GetString(New Byte() {4})
  9.    Dim enq As String = ASCIIEncoding.ASCII.GetString(New Byte() {5})
  10.    Dim ack As String = ASCIIEncoding.ASCII.GetString(New Byte() {6})
  11.  
  12.  
  13.    Public Sub New()
  14.        InitializeComponent()
  15.        If Not SerialPort1.IsOpen Then
  16.            Try
  17.                SerialPort1.Open()
  18.            Catch ex As Exception
  19.                MessageBox.Show(ex.ToString)
  20.            End Try
  21.        End If
  22.        AddHandler SerialPort1.DataReceived, AddressOf recepcion
  23.    End Sub
  24.  
  25.    Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
  26.        If SerialPort1.IsOpen Then
  27.            SerialPort1.Close()
  28.        End If
  29.    End Sub
  30.  
  31.    Private Sub recepcion(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
  32.  
  33.        recibidos = Chr(SerialPort1.ReadChar)
  34.        If recibidos = stx Or recibidos = enq Then
  35.            SerialPort1.Write(ack)
  36.        Else
  37.            If recibidos <> stx And recibidos <> etx And recibidos <> enq And recibidos <> ack And recibidos <> eot Then
  38.                Me.Invoke(New EventHandler(AddressOf actualizar))
  39.            Else
  40.                If recibidos = eot Then
  41.                    Me.Invoke(New EventHandler(AddressOf actualizarenter))
  42.                Else
  43.                    If recibidos = etx Then
  44.                        SerialPort1.Write(ack)
  45.                    End If
  46.                End If
  47.            End If
  48.        End If
  49.  
  50.  
  51.    End Sub
  52.  
  53.    Private Sub actualizar(ByVal s As Object, ByVal e As EventArgs)
  54.        textbox_visualizar_mensaje.Text = textbox_visualizar_mensaje.Text & recibidos
  55.    End Sub
  56.  
  57.    Private Sub actualizarenter(ByVal s As Object, ByVal e As EventArgs)
  58.        textbox_visualizar_mensaje.Text = textbox_visualizar_mensaje.Text & vbLf
  59.    End Sub
  60.  
  61.    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  62.        StatusStrip1.Items(0).Text = DateTime.Now.ToLongTimeString
  63.    End Sub
  64.  
  65.    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  66.        SerialPort1.Encoding = System.Text.Encoding.Default
  67.    End Sub
  68. End Class


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.809



Ver Perfil
Re: Envios y recibos de caracteres VB .net
« Respuesta #1 en: 1 Marzo 2015, 18:08 pm »

uf, estás utilizando malas prácticas de programación en todos los rincones del código xD.

Prueba así (no lo he testeado, ni tampoco se si he entendido correctamente las condiciones que dices que se deben dar al recibir los datos, pero desde luego puedes simplificar ese IF anidado de tú código en un Switch/Select Case):
Código
  1. #Region " Imports "
  2.  
  3. Imports System.IO.Ports
  4.  
  5. #End Region
  6.  
  7. Public NotInheritable Class Form1 : Inherits Form
  8.  
  9. #Region " Objects / Constants-ReadOnly / Properties "
  10.  
  11.    ' Estos objetos los inicializo en el constructor del Form solo para poder compilar este ejemplo.
  12.    Private WithEvents sp As SerialPort
  13.    Private ReadOnly ss As StatusStrip
  14.    Private ReadOnly tb As TextBox
  15.    ' ***********************************************
  16.  
  17.    Private WithEvents tmr As New Timer
  18.  
  19.    Private ReadOnly charStx As Char = Convert.ToChar(&H1)
  20.    Private ReadOnly charEtx As Char = Convert.ToChar(&H3)
  21.    Private ReadOnly charEot As Char = Convert.ToChar(&H4)
  22.    Private ReadOnly charEnq As Char = Convert.ToChar(&H5)
  23.    Private ReadOnly charAck As Char = Convert.ToChar(&H6)
  24.  
  25.    ''' <summary>
  26.    ''' Gets the next character from the device's input buffer.
  27.    ''' </summary>
  28.    ''' <value>The next character from the device's input buffer.</value>
  29.    Private ReadOnly Property NextChar As Char
  30.        Get
  31.            Return Convert.ToChar(Me.sp.ReadChar)
  32.        End Get
  33.    End Property
  34.  
  35. #End Region
  36.  
  37. #Region " Constructors "
  38.  
  39.    Public Sub New(ByVal sp As SerialPort, ByVal ss As StatusStrip, ByVal tb As TextBox)
  40.  
  41.        MyClass.InitializeComponent()
  42.  
  43.        Me.sp = sp
  44.        Me.ss = ss
  45.        Me.tb = tb
  46.  
  47.    End Sub
  48.  
  49.    Public Sub New()
  50.        MyClass.InitializeComponent()
  51.    End Sub
  52.  
  53. #End Region
  54.  
  55. #Region " Event-Handlers "
  56.  
  57.    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
  58.    Handles Me.Load
  59.  
  60.        Me.OpenPort(Me.sp)
  61.  
  62.    End Sub
  63.  
  64.    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) _
  65.    Handles Me.FormClosing
  66.  
  67.        Me.ClosePort(Me.sp)
  68.  
  69.    End Sub
  70.  
  71.    Private Sub Serialport1_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) _
  72.    Handles sp.DataReceived
  73.  
  74.        Me.ProcessChar(Me.NextChar)
  75.  
  76.    End Sub
  77.  
  78.    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) _
  79.    Handles tmr.Tick
  80.  
  81.        ss.Items(0).Text = DateTime.Now.ToLongTimeString
  82.  
  83.    End Sub
  84.  
  85. #End Region
  86.  
  87. #Region " Private Methods "
  88.  
  89.    Private Sub OpenPort(ByVal sp As SerialPort)
  90.  
  91.        If Not sp.IsOpen Then
  92.  
  93.            Try
  94.                sp.Open()
  95.  
  96.            Catch ex As Exception
  97.                MessageBox.Show(ex.ToString &
  98.                                Environment.NewLine &
  99.                                ex.StackTrace, "error", MessageBoxButtons.OK, MessageBoxIcon.Error)
  100.  
  101.            End Try
  102.  
  103.        End If
  104.  
  105.    End Sub
  106.  
  107.    Private Sub ClosePort(ByVal sp As SerialPort)
  108.  
  109.        If sp.IsOpen Then
  110.  
  111.            Try
  112.                sp.Close()
  113.  
  114.            Catch ex As Exception
  115.                MessageBox.Show(ex.ToString &
  116.                                Environment.NewLine &
  117.                                ex.StackTrace, "error", MessageBoxButtons.OK, MessageBoxIcon.Error)
  118.  
  119.            Finally
  120.                If sp IsNot Nothing Then
  121.                    sp.Dispose()
  122.                End If
  123.  
  124.            End Try
  125.  
  126.        End If
  127.  
  128.    End Sub
  129.  
  130.    Private Sub ProcessChar(ByVal chr As Char)
  131.  
  132.        Select Case chr
  133.  
  134.            Case Me.charStx, Me.charEnq, Me.charEtx
  135.                sp.Write(Me.charAck)
  136.  
  137.            Case Me.charAck
  138.                ' Do Nothing?.
  139.  
  140.            Case Me.charEot
  141.                Me.ThreadSafeAppendText(Me.tb, chr & ControlChars.Lf)
  142.  
  143.            Case Else
  144.                Me.ThreadSafeAppendText(Me.tb, chr)
  145.  
  146.        End Select
  147.  
  148.    End Sub
  149.  
  150.    Private Sub ThreadSafeAppendText(ByVal tb As TextBox, ByVal str As String)
  151.  
  152.        SyncLock tb
  153.  
  154.            If tb.InvokeRequired Then
  155.                tb.Invoke(Sub() tb.AppendText(str))
  156.  
  157.            Else
  158.                tb.AppendText(str)
  159.  
  160.            End If
  161.  
  162.        End SyncLock
  163.  
  164.    End Sub
  165.  
  166. #End Region
  167.  
  168. End Class

Nota:
En mi modificación no modifico la codificación de entrada del dispositivo, ya que puedes hacerlo de la siguiente manera, al declarar e inicializar el puerto de serie:
Código
  1. Dim sp As New SerialPort With
  2.    {
  3.      .Encoding = Encoding.Default
  4.    }

Saludos


« Última modificación: 1 Marzo 2015, 18:14 pm por Eleкtro » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines