Enviar datos en hex por el puerto serie.

A la pregunta:


è Necesitaría información de cómo enviar datos en hex por el puerto serie, porque por defecto lo hace en ASCII.


Realmente la información no se envía en ASCII por defecto, si no en función al ‘Encoding’ utilizado. En realidad estamos serializando un Byte…


        Dim MiPuerto = My.Computer.Ports.OpenSerialPort(“COM1″)


        MiPuerto.Write(&HFF)    ‘Enviar valor hex FF


        Dim Valor As Byte = 255


        MiPuerto.Write(Valor)   ‘Enviar byte 255



En ambos casos enviaremos ocho bits ‘1111 1111’ si utilizamos una longitud de 8, por lo que el DTE recibirá el valor binario 255.


En determinadas situaciones, el micro controlador espera que le mandemos los ‘nibbles’ encapsulados en ASCII, o sea para enviarle el valor de 8 bits, necesitaremos su representación hexadecimal en forma de dos Bytes ASCII, por ejemplo los caracteres ‘7’ y ‘F’ para el valor 127, por lo tanto estaremos mandando 16bits de datos para representar un valor hexadecimal de 8bits.


En tal caso simplemente especificaremos


        Valor = 127


        MiPuerto.Write(Hex(Valor))


 


En este supuesto el micro controlador recibirá ‘7F’, correspondiente al valor binario 127.


No dudéis en continuar esta conversación si la explicación no resulta lo suficientemente clara.
Pep Lluis,

23 thoughts on “Enviar datos en hex por el puerto serie.”

  1. Hola Luis me gustaria si me podrias dar una mano en como seria el ejemplo en codigo c# y que librerias usas, te lo agradeceria de antemano si lees este comentario.

     

  2. Ok Edwin,
    Tienes la respuesta en tu correo, si necesitas alguna aclaracion, puedes contactar de nuevo.

    Espero que la respuesta te sea util,
    Pep Lluis,

  3. Hola Armando,
    Las expresiones en C# para valores hex son…

    // Enviar valores hex (En realidad bytes)
    byte[] miBuffer = new byte[81];
    miBuffer[0] = 0x01;
    miBuffer[1] = 0x20;
    miBuffer[2] = 0x21;
    miBuffer[3] = 0x22;
    miBuffer[4] = 0x23;
    miBuffer[5] = 0x24;
    miBuffer[6] = 0x25;
    // Bla… Bla
    miBuffer[80] = 0x3f;
    this.serialPort1.Write(miBuffer, 0, miBuffer.Length);

  4. Hola elbuenar,
    Puedes conmigo a traves de la opcion [Contact] en el menu superior al margen derecho de esta pagina.
    Saludos,
    Pep Lluis,

  5. Hola

    Tu blog esta muy bien.

    Te pido ayuda espero me puedas orientar.

    Estoy haciendo un proyecto en C# para un lector Mifare y la unica información que tengo es que le tarjetas Mifare 4K y es USB to UART bridge. Y cuando me entregaron el lector solo tenia los drivers de CP2102 para el puerto USB y no tenia documentación. Y soy un principiante en C#. Y documentandome hice la primera parte para de los Mifare COMMAND SET en C#. Y este es el siguiente codigo:

    Para el primer paso es abrir el puerto

    private bool Send_Data(byte[] cmd, int Lenght)
           {
           //Envia datos
               int index = 0;
               try
               {
                   if (this.PuertoCOM.IsOpen)
                   {
                       this.PuertoCOM.ReadTimeout = 0x7d0;
                       cmd[cmd.Length - 2] = this.CheckSum(cmd);
                       this.PuertoCOM.Write(cmd, 0, cmd.Length);
                       while (index < this.datos.Length)
                       {
                           this.datos[index] = 0;
                           index++;
                       }
    //recibe datos
                       string s = this.PuertoCOM.ReadExisting();
                       for (index = 0; index < Lenght; index++)
                       {
                           this.datos[index] = (byte)this.PuertoCOM.ReadByte();
                       }
                       this.fnShowInWnd(this.datos); // Muestra datos en TextBox
                   }
                   return true;
               }
               catch (TimeoutException exception)
               {
                   MessageBox.Show(exception.Message);
                   return false;
               }

    El problema es en el tercer mejor dicho dos problemas.

    Cuando lee varias veces la misma tarjeta el ID es diferente.

    El otro problema es cuando lee varias tarjetas primero la Tarjeta 1 despues tarjeta 2 y Tarjeta 3, al leer la ultima tarjeta (3) el buffer se queda con la tarjeta (2).

    No se que este haciendo mal.

    Existe alguna otra forma de leer una tarjeta?.

    Espero me puedas ayudas. Hasta pronto.

  6. Hola,
    En este caso creo que estas asociando la recepcion de datos del dispositivo a la transmision de los tuyos desde el equipo.

    Deberias desvincular envio/recepcion… te aconsejo utilices las tecnicas descritas en alguno de los ejmplos del Blog… utilizando el ‘DataReceived’ para poder obtener tramas completas.

    Suerte… y ya nos tendras al corriente!
    Pep Lluis,

  7. Hola pepLLuis, e estado mirando el blog y veo que pilotas mucho en tema de dispositivos, a ver si puedo ver la luz que seguro que para ti es sencillo.
    El tema es que estoy trabajando con una balanza y el método de transmisión es el modelo TISA, es decir tengo que mandar una trama al puerto COM para que me mande la información el formato de la trama es 98PPPPPCrLf
    Donde:
    98: 0x38h y 0x39h
    PPPPP: 5 dígitos para el precio.
    C: Checksum, suma lógica (XOR) de todos los caracteres anteriores.
    CR: 0x0Dh LF: 0x0Ah

    La cosa es que no se como enviarlo o lo envío mal porque se queda sin respuesta en serialPort1_DataReceived y si ago un ReadLine se queda bloqueado. La configuración del puerto la tengo correcta creo que fallo a la hora de mandar el dato o es un tema de demora.
    Me puedes dar algunas pautas por favor, estoy usando Framework 3.5 y C# la cosa es que estoy bloqueado.
    Muchas gracias pepLLuis.

  8. Hola pepLLuis, e estado mirando el blog y veo que pilotas mucho en tema de dispositivos, a ver si puedo ver la luz que seguro que para ti es sencillo.
    El tema es que estoy trabajando con una balanza y el método de transmisión es el modelo TISA, es decir tengo que mandar una trama al puerto COM para que me mande la información el formato de la trama es 98PPPPPCrLf
    Donde:
    98: 0x38h y 0x39h
    PPPPP: 5 dígitos para el precio.
    C: Checksum, suma lógica (XOR) de todos los caracteres
    anteriores.
    CR: 0x0Dh LF: 0x0Ah
    La cosa es que no se como enviarlo o lo envío mal porque se queda sin respuesta en serialPort1_DataReceived y si ago un ReadLine se queda bloqueado. La configuración del puerto la tengo correcta creo que fallo a la hora de mandar el dato o es un tema de demora.
    Me puedes dar algunas pautas por favor, estoy usando Framework 3.5 y C# la cosa es que estoy bloqueado.
    Muchas gracias pepLLuis.

  9. Hola Rebe.. has probado usar este ejemplo :

    http://msmvps.com/blogs/peplluis/archive/2007/01/24/componer-las-tramas-recibidas-en-el-puerto-serie-c.aspx

    En el se explica como enviar/componer las tramas recibidas. Debes descargarte el archivo adjunto : TramasPuertoSerie.zip, creo que es justo lo que andas buscando.

    Si no responde no dudes en contactar conmigo a traves de la opcion [Contact] en la parte superior derecha de esta pagina.

    Saludos,
    Pep Lluis,

  10. Hola PepLluis, hace varios días que leo tus ejemplos y la verdad es que estoy aprendiendo un montón de comunicación RS232, pero me encuentro con un problema que no puedo solventar y seguramente para ti será trivial. Estoy intentando enviarle una trama a un datafono de tarjetas de crédito, estas tramas tienen que ser en hexadecimal, y por algún motivo el datafono no me contesta, en cambio con un programita freeware que me bajé si consigo respuestas, pero no tengo los fuentes para saber que no estoy haciendo bien. Estoy programando con VB.net 2008, la trama hexadecimal que le quiero enviar es la siguiente: 0x02,0x32,0x30,0x30,0x30,0x30,0x30,0x31,0x32,0x33,0x03,0x31
    ¿Qué estoy haciendo mal?
    Muchas gracias de antemano y saludos.
    El código donde he utilizado varios métodos es este:
    Public Class Form1
    Private Ingenico As New System.IO.Ports.SerialPort

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Ingenico.PortName = “COM1″
    Ingenico.BaudRate = 9600
    Ingenico.Parity = IO.Ports.Parity.None
    Ingenico.StopBits = 1
    Ingenico.DataBits = 8

    Ingenico.Open()

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    ” Metodo 1
    Ingenico.Write(&H2)
    Ingenico.Write(&H32)
    Ingenico.Write(&H30)
    Ingenico.Write(&H30)
    Ingenico.Write(&H30)
    Ingenico.Write(&H30)
    Ingenico.Write(&H30)
    Ingenico.Write(&H31)
    Ingenico.Write(&H32)
    Ingenico.Write(&H33)
    Ingenico.Write(&H3)
    Ingenico.Write(&H31)

    ”Metodo 2
    ‘Ingenico.Write(“&H2,&H32,&H30,&H30,&H30,&H30,&H30,&H31,&H32,&H33,&H3,&H31″)

    ”Metodo 3
    ‘Ingenico.Write(“&H2&H32&H30&H30&H30&H30&H30&H31&H32&H33&H3&H31″)

    ”Metodo 4
    ‘Ingenico.Write(“023230303030303132330331″)

    End Sub
    End Class

  11. Hola Albert,
    El metodo 1 y 2 son correctos aunque en el dos debes separar byte a byte… ejemplo :

    ngenico.Write(“&H2″+”&H32″+”&H30″…

    Lo unico que no veo en tu trama es el final de la misma, la mayoria de dispositivos requieren un fin de trama ya sea un 0x0D o un 0x0A.

    No se si esto te ayuda, en caso contrario no dudes en contactarme a traves de [Contact]

  12. Hola Peplluis:
    Me encuentro realizando un programa para la trasmisión de datos por el puerto serie con vb.net. En el programa que realice ya puedo establecer comunicación con otra máquina por el puerto serie. Pero lo que en realidad quiero es realizar un puente virtual dentro de una misma computadora, es decir, lo que reciba por el puerto COM1 desde un dispositivo externo lo transmita al COM5(Misma máquina) a otro dispositivo externo y lo que reciba por el COM5 lo envié al COM1 con los puertos de la misma máquina:

    COM1 ->SOFTWARE ->COM5 en los dos sentidos COM1<-SOFTWARE-

    Lo que pretendo hacer es atrapar la información que está mandando el puerto al lector para después analizarla y tomar lo que me sirva todo ello sin que el dispositivo deje de funcionar, es por eso que requiero retransmitir absolutamente todas las señales y datos.
    Te agradecería si me pudieras orientar en la manera de realizar este programa que herramienta ocupar o algo que pueda emplear.
    Sin Mas por el momento me despido esperando tu respuesta.
    ALMA DELIA CRUZ

  13. Quiero controlar un proyector por el puerto serie quisiera saber como enviar el codigo (02H 00H 00H 00H 00H 02H)utilizo VB6, con LCD en ascii funciona bien pero en Hex tengo problemas, alguna pista. Gracias

  14. Feliz Navidad Ricardo,

    Utiliza la opcion [Contact] de este blog para especificar que tipo de problemas en Hex tienes. Pues con la información facilitada no es sufiente.

    Espero tus noticias,
    Pep Lluis,

  15. hola luis tenia una consulta , como puedo convertir cualquier numero entero introducido en un textbox para despues convertirlo a hexadecimal y luego enviarlo por RS232

  16. Hola buen día necesito trasmitir datos en lenguaje c, eh consultado varios foros y no eh obtenido una respuesta espero que me puedan ayudar por favor lo necesito. De ante mano muchas gracias por el apoyo.

  17. solo es quisiera de favor el codigo pero en c# ya que quiero controlar la posicion de un motor a pasos, pero no se como enviar numeros como 4000 que son 4segundos que tardaria en paso y paso por el puerto serial.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>