none
Enviar y Recibir caracteres de control VB 2010 RRS feed

  • Pregunta

  • Buenas tardes a todos tengo el siguiente problema, estoy intentando comunicar una computadora a una maquina BCPLUS3000

    El problema surge a la hora de leer y enviar los caracteres de control, no se en que le estoy errando pero en ningùn momento recibo un EOT, ETX,EOF, etc. Con este problema de no leer correctamente los caracteres no puedo responder o realizar las acciones necesarias.

    Dejo parte del codigo, no todo ya que no es necesario lo que falla es la lectura el resto funciona.

    Imports System Imports System.IO Public Class Form1 Dim WithEvents serialport As New IO.Ports.SerialPort Dim lacuenta As Integer = 0 Public Const STX = &H2 Public Const ETX = &H3 Public Const EOT = &H4 Public Const ENQ = &H5 Public Const ACK = &H6 Public Const EOFF = &H1A Public laruta As String = "" Public ruta As String = "" Public stw As System.IO.StreamWriter 'esto es para escribir en un archivo los resultados' Public Delegate Sub mydelegate() Private Sub btnconnect_Click(sender As System.Object, e As System.EventArgs) Handles btnconnect.Click If serialport.IsOpen Then serialport.Close() End If Try

    With serialport .PortName = CbbCOMports.SelectedValue.ToString .BaudRate = 9600 serialport.Encoding =System.Text.Encoding.Default If OptEven.Checked = True Then .Parity = Ports.Parity.Even Else If OptOdd.Checked = True Then .Parity = Ports.Parity.Odd Else .Parity = Ports.Parity.None End If End If If Opt7.Checked = True Then .DataBits = 7 Else .DataBits = 8 End If If Opt1.Checked = True Then .StopBits = 1 Else .StopBits = 2 End If End With serialport.Open() Catch ex As Exception MessageBox.Show(ex.ToString) End Try End Sub Private Sub serialport_DataReceived(sender As Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serialport.DataReceived txtDataReceived.Invoke(New _ mydelegate(AddressOf updateTextBox), _ New Object() {}) End Sub Public Sub updateTextBox() Try

     Dim cadena As String = ""
                Dim contenido As String = serialport.ReadChar
                If Val(contenido) = ENQ Or Val(contenido) = STX Then
                    serialport.Write(ACK)

                End If



                If Val(contenido) <> STX And Val(contenido) <> EOT And Val(contenido) <> ENQ And Val(contenido) <> ACK And Val(contenido) <> ETX And Val(contenido) <> EOFF Then
                    cadena = cadena & Chr(contenido)
                    stw.Write(cadena)
                Else


                    If Val(contenido) = EOT Or Val(contenido) = ETX Or Val(contenido) = EOFF Then
                        cadena = cadena & vbCrLf
                        txtDataReceived.Text = cadena
                        stw.Write(cadena)
                        stw.Write(vbCrLf)
                    End If
                End If

    With txtDataReceived .Font = New Font("Arial", 10.0!, FontStyle.Bold) .SelectionColor = Color.Blue .AppendText(cadena) If contenido <> "" Then St.Items.Clear() St.Items.Add("Cantidad de renglones recibidos:" & " " & lacuenta) End If .ScrollToCaret() End With Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub End Class

    Espero puedan darme una mano porque llevo un mes con esto sin exagerar y no logro encontrar el error, no se que me estoy salteando o en que le estoy errando, muchas gracias.






    miércoles, 25 de febrero de 2015 8:07

Respuestas

  • Hola:

    Te paso este enlace sobre comunicación por puerto serie con VB .net 2008 que descargas en PDF.

    http://electronica-pic.blogspot.com.es/2009/03/manual-interfaz-vc-y-visual-basic.html

    Como explica en el tutorial o manual, mejor envía y recibas los comandos mediantes tramas de bytes.

    Para que lo sepas, estoy haciendo otro tutorial más actualizado con los tres lenguajes VB, C# y C++ 2013.

    Si quieres que te pase este nuevo tutorial que aú no he acabado la parte de electrónica pero si el envío y recibo de tramas de bytes te lo paso por correo electrónico. Ya me dirás.

    Un saludos.


    http://electronica-pic.blogspot.com

    jueves, 26 de febrero de 2015 14:31

Todas las respuestas

  • Hola:

    Te paso este enlace sobre comunicación por puerto serie con VB .net 2008 que descargas en PDF.

    http://electronica-pic.blogspot.com.es/2009/03/manual-interfaz-vc-y-visual-basic.html

    Como explica en el tutorial o manual, mejor envía y recibas los comandos mediantes tramas de bytes.

    Para que lo sepas, estoy haciendo otro tutorial más actualizado con los tres lenguajes VB, C# y C++ 2013.

    Si quieres que te pase este nuevo tutorial que aú no he acabado la parte de electrónica pero si el envío y recibo de tramas de bytes te lo paso por correo electrónico. Ya me dirás.

    Un saludos.


    http://electronica-pic.blogspot.com

    jueves, 26 de febrero de 2015 14:31
  • Por favor te voy a pedir que me envies el tutorial, agradezco tu respuesta ahora mismo estoy viendo el tuto.

    Mi mail es: lucaa31@hotmail.com

    jueves, 26 de febrero de 2015 14:53
  • Deja que lo pase a PDF, tarda un tiempo y son unos megas.

    Enviando....


    http://electronica-pic.blogspot.com

    jueves, 26 de febrero de 2015 15:00
  • Hola denuevo.

    Enviado.

    Ver vídeo.

    https://www.youtube.com/watch?v=g7XPhDL6auA

    Si tienes duda, a lo mejor es buena idea empezar desde cero, me planteas los pasos que quieres hacer y manos a la obra.

    Salu2.


    http://electronica-pic.blogspot.com



    • Editado Metaconta jueves, 26 de febrero de 2015 15:49
    jueves, 26 de febrero de 2015 15:27
  • Te envie un email nuevamente con una consulta, estarìa agradecido si podes revisarlo, gracias.

    EDITO: Los pasos serian los siguientes

    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.

    Imports System.IO.Ports
    Imports System.Text
    
    Public Class Form1
        Dim recibidos As String
        Dim stx As String = ASCIIEncoding.ASCII.GetString(New Byte() {2})
        Dim etx As String = ASCIIEncoding.ASCII.GetString(New Byte() {3})
        Dim eot As String = ASCIIEncoding.ASCII.GetString(New Byte() {4})
        Dim enq As String = ASCIIEncoding.ASCII.GetString(New Byte() {5})
        Dim ack As String = ASCIIEncoding.ASCII.GetString(New Byte() {6})
    
    
        Public Sub New()
            InitializeComponent()
            If Not SerialPort1.IsOpen Then
                Try
                    SerialPort1.Open()
                Catch ex As Exception
                    MessageBox.Show(ex.ToString)
                End Try
            End If
            AddHandler SerialPort1.DataReceived, AddressOf recepcion
        End Sub
    
        Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            If SerialPort1.IsOpen Then
                SerialPort1.Close()
            End If
        End Sub
    
        Private Sub recepcion(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
    
            recibidos = Chr(SerialPort1.ReadChar)
            If recibidos = stx Or recibidos = enq Then
                SerialPort1.Write(ack)
            Else
                If recibidos <> stx And recibidos <> etx And recibidos <> enq And recibidos <> ack And recibidos <> eot Then
                    Me.Invoke(New EventHandler(AddressOf actualizar))
                Else
                    If recibidos = eot Then
                        Me.Invoke(New EventHandler(AddressOf actualizarenter))
                    Else
                        If recibidos = etx Then
                            SerialPort1.Write(ack)
                        End If
                    End If
                End If
            End If
    
    
        End Sub
    
        Private Sub actualizar(ByVal s As Object, ByVal e As EventArgs)
            textbox_visualizar_mensaje.Text = textbox_visualizar_mensaje.Text & recibidos
        End Sub
    
        Private Sub actualizarenter(ByVal s As Object, ByVal e As EventArgs)
            textbox_visualizar_mensaje.Text = textbox_visualizar_mensaje.Text & vbLf
        End Sub
    
        Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
            StatusStrip1.Items(0).Text = DateTime.Now.ToLongTimeString
        End Sub
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            SerialPort1.Encoding = System.Text.Encoding.Default
        End Sub
    End Class

    Ese es mi còdigo actualmente, pero trae mugre el còdigo, trae estos simbolos que no me representan nada, los simbolos de sexualidad,  otros como este( ~)





    jueves, 26 de febrero de 2015 17:36
  • Primero lo hago con C#.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    using System.IO.Ports; // No olvidar.
    
    namespace Probando_RS232
    {
        public partial class Form_Principal : Form
        {
            // Utilizremos un string como buffer de recepción.
            string Recibidos;
            //string Recibo_STX_02 = ASCIIEncoding.ASCII.GetString(new byte[] { 2 }); // Inico de texto.
            //string Recibo_ENQ_05 = ASCIIEncoding.ASCII.GetString(new byte[] { 5 }); // Enquiry, investigación.
            //string Recibo_ETX_03 = ASCIIEncoding.ASCII.GetString(new byte[] { 3 }); // Fin de texto.
            //string Recibo_ACK_06 = ASCIIEncoding.ASCII.GetString(new byte[] { 6 }); // Acknowledge, reconocer.
            //string Recibo_EOT_04 = ASCIIEncoding.ASCII.GetString(new byte[] { 4 }); // Fin de transmisión.
    
            string Recibo_STX_02 = "STX"; // Inico de texto.
            string Recibo_ENQ_05 = "ENQ"; // Enquiry, investigación.
            string Recibo_ETX_03 = "ETX"; // Fin de texto.
            string Recibo_ACK_06 = "ACK"; // Acknowledge, reconocer.
            string Recibo_EOT_04 = "EOT"; // Fin de transmisión.
            
        
            public Form_Principal()
            {
                InitializeComponent();
    
                // Abrir puerto mientras se ejecute la aplicación.
                if(!serialPort1.IsOpen)
                    {
                        try
                    {
                        serialPort1.Open();
                    }
                        catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                        // Ejecutar la función Recepcion por disparo del Evento 'DataReived'.
                        serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion);
                    }
            }
    
            // Al recibir datos.
            private void Recepcion(object sender, SerialDataReceivedEventArgs e)
            {
                // Acumula los caracteres recibidos a nuestro 'buffer' (string).
                Recibidos += serialPort1.ReadExisting();
    
                // Invocar o llamar al proceso de tramas.
                Invoke(new EventHandler(Actualizar));
            }
    
            // Procesar los datos recibidos en el bufer y extraer tramas completas.
            private void Actualizar(object sender, EventArgs e)
            {
    
    
                if ((Recibidos == Recibo_STX_02) || (Recibidos == Recibo_ENQ_05))
                {
                    byte[] mBuffer = Encoding.ASCII.GetBytes("ACK");
                    serialPort1.Write(mBuffer, 0, mBuffer.Length);
                    richTextBox_Mensajes.Text = "Enviado ACK_06.";
                }
    
                else
                {
                    if ((Recibidos != "2") & (Recibidos != "3") & (Recibidos != "5") & (Recibidos != "6") & (Recibidos != "4")) // != si son iguales devuelve false;
                    {
                        this.Invoke(new EventHandler(Actualizar));
                    }
    
                    else
                    {
                        if (Recibidos == "4") // EOT.
                        {
                            this.Invoke(new EventHandler(actualizarenter));
                        }
                        else
                        {
                            if (Recibidos == "3") // ETX.
                            {
                                byte[] mBuffer = Encoding.ASCII.GetBytes("ACK");
                                serialPort1.Write(mBuffer, 0, mBuffer.Length);
                                richTextBox_Mensajes.Text = "Enviado ACK_06 en Recibidos ETX_3.";
                            }
                        }
                    }
                }
            }
    
            private void actualizarenter(object s, EventArgs e)
            {
                Recibidos = richTextBox_Mensajes.Text.ToString();
            }
        }
    }
    
    

    Tienes if dentro que no debería esta anidado. cuando viene muchas tramas pegadas, tienes que separarlas con split para que lo pueda interpretar.


    http://electronica-pic.blogspot.com

    viernes, 27 de febrero de 2015 14:57
  • Muchas gracias por tu ayuda, te hago consultas porque estoy perdido, espero puedas ayudarme.

    Veo que usas un readexisting, el ACK, ETX llegan en forma de string? yo pense que llegaba el valor hex o ascii no la palabra "ETX, ENQ ",etc.

    Tengo un problema con el readexisting y es que este te trae TODO lo que hay disponible, entonces en la trama pueden aparecer los EOT, ETX, por ejemplo "Hola como estasEOT" y por mas que uso split no logro que encuentre el EOT para trabajarlo en el if anidado.

    En la parte que pones "if recibidos = "2"" , etc. Lo remplazo por Recibo_STX_02?

    Por otro lado dejo el còdigo en VB.NET lo pase de C#

    Imports System
    Imports System.Collections.Generic
    Imports System.ComponentModel
    Imports System.Data
    Imports System.Drawing
    Imports System.Linq
    Imports System.Text
    Imports System.Threading.Tasks
    Imports System.Windows.Forms
    Imports System.IO.Ports
    
    
    Public Class Form1
        Dim Recibo_STX_02 As String = "STX" ' Inico de texto.'
        Dim Recibo_ENQ_05 As String = "ENQ" ' Enquiry, investigación.'
        Dim Recibo_ETX_03 As String = "ETX" ' Fin de texto.'
        Dim Recibo_ACK_06 As String = "ACK" ' Acknowledge, reconocer.'
        Dim Recibo_EOT_04 As String = "EOT" ' Fin de transmisión.'
        Dim recibidos As String
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            If Not SerialPort1.IsOpen Then
                Try
                    SerialPort1.Open()
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                End Try
                AddHandler SerialPort1.DataReceived, AddressOf recepcion
            End If
    
        End Sub
    
        Private Sub recepcion(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
            recibidos += SerialPort1.ReadExisting()
            Me.Invoke(New EventHandler(AddressOf actualizar))
        End Sub
    
        Private Sub actualizar(ByVal s As Object, ByVal e As EventArgs)
            If recibidos = Recibo_STX_02 Or recibidos = Recibo_ENQ_05 Then
                Dim mBuffer As Byte() = Encoding.ASCII.GetBytes("ACK")
                SerialPort1.Write(mBuffer, 0, mBuffer.Length)
                richTextBox_Mensajes.Text = "Enviado ACK_06."
            Else
                If recibidos <> "2" And recibidos <> "3" And recibidos <> "4" And recibidos <> "5" And recibidos <> "6" Then
                    richTextBox_Mensajes.Text = richTextBox_Mensajes.Text & recibidos
                Else
                    If recibidos = "4" Then
                        Me.Invoke(New EventHandler(AddressOf actualizarenter))
                    Else
                        If recibidos = "3" Then
                            Dim mBuffer As Byte() = Encoding.ASCII.GetBytes("ACK")
                            SerialPort1.Write(mBuffer, 0, mBuffer.Length)
                            richTextBox_Mensajes.Text = "Enviado ACK_06 en recibidos ETX_3."
                        End If
                    End If
    
                End If
            End If
        End Sub
    
        Private Sub actualizarenter(ByVal s As Object, ByVal e As EventArgs)
            richTextBox_Mensajes.Text = richTextBox_Mensajes.Text.ToString
        End Sub
    End Class




    viernes, 27 de febrero de 2015 17:08
  • Hola:

    Luego miro con más calma. Lo que dejo claro que siempre recibe en hex lso datos que viajan por el puerto.

    Todo lo que atrapes lo almacenas en un Buffer.

    Otra cosa, los pasos que has escrito antes no corresponde a lo que has programado.

    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.

    Paso 1) y paso 2) está bien de lo que quieres.

    El paso 3) le envías ACK. ¿Qué máquina es? (Curiosidad).En el paso 4) esperas recibir un EOT y mandas un Enter me imagino que te refieres al Retorno de Carro. ¿Me equivoco?

    Como puedes ver es el 13 y se llama CR con mayúscula. Es importante que pongo realmente lo que es, en mayúscula.

    En el paso 5) puedes hacerlo con un if.

    El código que puse no está bien hecho, no te había entendido. Así que empezaré otra vez. Que no pasa nada.

    Lo mejor es poner un Case. Como habías dicho al principio o artarde de muchos if else. Luego programo tus pasos que ahora lo entiendo mejor que antes, será que lo habrás editado y no me he dado cuenta.

    Saludos.

    Edito:

    '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.
    
    Private Sub Actualizar(sender As Object, e As EventArgs)
    
        Dim miBuffer As Byte() = New Byte(0) {}
    
        Select Case Recibidos
    
            Case "ENQ", "STR", "EXT"
                ' Enviar tramas de bytes.
    
                miBuffer(0) = &H6
                ' ASCII "ACK".
                serialPort1.Write(miBuffer, 0, miBuffer.Length)
                ' Envia las tramas de bytes.
                Recibidos = ""
                Exit Select
    
            Case "EOT"
                ' Enviar tramas de bytes.
                miBuffer(0) = &Hd
                ' ASCII "CR".
                serialPort1.Write(miBuffer, 0, miBuffer.Length)
                ' Envia las tramas de bytes.
                Recibidos = ""
                Exit Select
            Case Else
    
                If "STX" = Recibidos OrElse "ENQ" = Recibidos OrElse "ETX" = Recibidos OrElse "ACK" = Recibidos OrElse "EOT" = Recibidos Then
                    richTextBox_Mensajes.Text = Recibidos
                    Recibidos = ""
                End If
                Exit Select
        End Select
    End Sub

    Suelo usar este convertidor.

    http://converter.telerik.com/


    http://electronica-pic.blogspot.com



    • Editado Metaconta viernes, 27 de febrero de 2015 21:15
    viernes, 27 de febrero de 2015 18:48
  • Gracias nuevamente por tu ayuda, sigo haciendo preguntas porque hay cosas que no entiendo. Como veras estoy muy perdido en el tema y hago un gran esfuerzo por entender pero me cuesta mucho.

    1) Segun lo que vos me decis los puertos envìan en Hex, entonces al comparar lo recibido con un string jamas lo voy a encontrar verdad?. Supongamos que recibo &H2(asì es en hex sino me equivoco) y lo comparo con un string "STX" jamas van a coincidir. En ese caso tendria que convertir lo recibido a string? o me estoy equivocando?

    2) Que tipo de read hay que usar, se que el puerto soporta readbyte, readexisting, entre otros. Si uso readexisting tengo que separar las palabras de la cadena y convertirlas a Hex para comparar?

    viernes, 27 de febrero de 2015 23:45
  • Hola:

    Justo en el manual que te entregué trata más bien trmas de bytes, así de simple.

    ¿Qué aparato estás usando?

    Saludos.


    http://electronica-pic.blogspot.com

    sábado, 28 de febrero de 2015 0:17
  • Estoy utilizando un aparato llamado BCPLUS3000 el cual contiene anàlisis de sangre de las personas.
    sábado, 28 de febrero de 2015 0:31
  • Buenas:

    Me imagino que será eso.

    Tiene que ser muy antiguo. ;)

    Tienes que saber que datos o comandos sabe interpretar este aparato. ¿Tienes algún documento al respecto sobre ello?

    Se suele llamar comandos AT&T. Si no lo posee, estás navegando a ciegas. El tutorial que te he mostrado es suficiente para hacer lo que quieres hacer. Si no tienes los documento de los comandos del aparato.

    Este es uno de ellos.

    https://www.youtube.com/watch?v=oUxq-ElTxtA

    Este se usa mucho.

    http://www.rs232-logger.com/

    También puedes construir uno con Arduino y grabar los datos en un archivo en una tarjesa micro SD, como tienes el PC, mejor lo aprovechas con el programa.

    Tienes que tener claro lo que hace la máquina. ¿Qué hace nada más al encenderla?

    ¿Qué funciones hace en el puerto serie?

    Y más preguntas. Si en la máuina hace algo cuando pulsas un botón, lo analizas, si te envía órdenes también, lo que sea.

    Saludos.


    http://electronica-pic.blogspot.com

    sábado, 28 de febrero de 2015 0:49
  • Es esa "maldita" maquina ajajaja. En la maquina elegis el resultado de un paciente, presionas "enter" y la màquina envia los datos a el programa.

    El manual es este y ahì dice todo : MIRAR PAGINA 318

    http://internetmed.com/sites/default/files/Mindray_BC-3000Plus_-_Operation_manual.pdf

    Saludos y gracias, me voy a cansar de decirte gracias pero necesito hacer funcionar esto.


    sábado, 28 de febrero de 2015 1:17
  • Buenas campeón:

    Lo estoy leyendo o un intento de ello. Como no se me da bien el Inglés y google translato a veces se le va la oya, si es posible, prefiero que traduza bien traducido y con calma estas frases.

    If the Handshake is off, BC-3000 Plus will transmi
    t the body of the text without acknowledging
    the presence of an external computer.
    If the Handshake is on, BC-3000 Plus will comm
    unicate with the external computer in
    following procedures:
    1. BC-3000 Plus sends an ENQ (05 Hex), then waits up to 4 seconds for the external
    computer to respond. If the external computer does not respond, then one more ENQ (05
    Hex) is tried. If it fails again, the analyzer aborts the transmission and reports a
    transmission error;
    2. The external computer must respond by
    sending an ACK (06 Hex). If any other response
    is received, another ENQ (05 Hex) will be s
    ent by the analyzer (maximum two ENQ [05
    Hex] will be sent);
    3. The analyzer then sends
    :
    Body of text
    EOT (04 Hex)
    ETX (03 Hex)
    4. Disconnection.
    BC-3000 Plus sends an ETX 03 Hex), then waits 4 seconds for the external computer to
    respond. If no response is received, one more ETX (03 Hex) is sent, BC-3000 Plus waits 4
    seconds before giving up and gives alarm of communication error. 

    Esta también.

    If the external compute responds ACK, the tran
    smission is done successfully. If the external
    computer responds NACK
    (15 Hex), the analyzer repeat the transmis
    sion from step 3. If the
    received response from the computer is neither ACK (06 Hex) nor NACK (15 Hex), the analyzer sends ETX(03 Hex) again. 


    Podemos hacer la primera opción. Si te envía

    ENQ (05 Hex)

    a tu PC con tu interfaz, le enviamos

    ACK (06 Hex)

    O bien automáticamente al instante, o dentro de 30 segundos o lo enviamos nosotros con un botón. Haremos el programa lo más simple posible. Vamos por parte y esta es una de ella.

    ¿Cómo se comporta la máquina si solo hacemos esto y nada más?

    Solo por ahora.

    Código sencillo, recibe datos en el richTextBox y con un button le envía el ENQ que tanto desea la máquina al ser encendida.

    Imports System.Collections.Generic
    Imports System.ComponentModel
    Imports System.Data
    Imports System.Drawing
    Imports System.Linq
    Imports System.Text
    Imports System.Threading.Tasks
    Imports System.Windows.Forms
    
    Imports System.IO.Ports
    ' No olvidar.
    Namespace Probando_RS232
    	Public Partial Class Form_Principal
    		Inherits Form
    		' Utilizremos un string como buffer de recepción.
    		Private Recibidos As String
    
    
    
    		Public Sub New()
    			InitializeComponent()
    
    			' Abrir puerto mientras se ejecute la aplicación.
    			If Not serialPort1.IsOpen Then
    				Try
    					serialPort1.Open()
    				Catch ex As System.Exception
    					MessageBox.Show(ex.ToString())
    				End Try
    				' Ejecutar la función Recepcion por disparo del Evento 'DataReived'.
    				serialPort1.DataReceived += New SerialDataReceivedEventHandler(AddressOf Recepcion)
    			End If
    		End Sub
    
    
    
    
    		' Al recibir datos.
    		Private Sub Recepcion(sender As Object, e As SerialDataReceivedEventArgs)
    			' Acumula los caracteres recibidos a nuestro 'buffer' (string).
    			Recibidos += serialPort1.ReadExisting()
    
    			' Invocar o llamar al proceso de tramas.
    			Invoke(New EventHandler(AddressOf Actualizar))
    		End Sub
    
    
    
    		Private Sub Actualizar(sender As Object, e As EventArgs)
    			'asignar el valor de la trama al texto box
    			richTextBox_Mensajes.Text = Recibidos
    
    		End Sub
    
    		Private Sub button_Enviar_ENQ_05_Click(sender As Object, e As EventArgs)
    			' Enviar tramas de bytes.
    			Dim miBuffer As Byte() = New Byte(9) {}
    			' Led_13_ON son 10 byte máximo.
    			miBuffer(0) = &H5
    			' ASCII letra "ENQ".
    			serialPort1.Write(miBuffer, 0, miBuffer.Length)
    			' Envia las tramas de bytes.
    		End Sub
    	End Class
    End Namespace

    Ya me dirás si recibe algo en la interfaz de VB .net


    Saludos.


    http://electronica-pic.blogspot.com

    sábado, 28 de febrero de 2015 2:06