none
Caracteres ASCII (8 bits) por el serialport. RRS feed

  • Pregunta

  • Hola,

    Estoy trabajando con una aplicación sencilla que envía/recibe datos por el puerto serie en formato ascii extendido (8 bits)

    Un ejemplo de frame : 55 55 3C 03 F9 F3 02 80 CF

    Mi problema es que al intentar mandar datos superiores a 7F, obtengo error de paridad (3F).

     

    He leído algo sobre la propiedad Encoding y que por defecto .NET usa ASCII (7bit). He intentado cambiarla para poder usar ASCII 8 bit,  pero no entiendo muy bien por qué.

    Escribo un string en el puerto con   puerto.Write(tx_buffer)

    ¿Alguien puede decirme como usar codificacion ASCII 8bit?

     

    pd: leyendo en este foro encontre que con    

     puerto.Encoding = System.Text.Encoding.GetEncoding(28591)

    mando datos superiores a 7F, como F3 ó F9 sin problemas, excepto el 80 que da error de paridad¿?

     

     

     

    • Cambiado PepLluisModerator miércoles, 9 de marzo de 2011 21:13 FORO DE COMUNICACIONES (De:Lenguaje VB.NET)
    viernes, 11 de febrero de 2011 8:32

Respuestas

  • Gracias a todos por responder.

    Es cierto que debería trabajar con bytes en vez de con strings, cuando tenga mas tiempo cambiaré el código.

    Provisionalmente lo he resuelto con puerto.Encoding = System.Text.Encoding.GetEncoding(1252)

    Encontré una lista de valores para getencoding que permite cambiar la codificación aquí:

    http://msdn.microsoft.com/en-us/library/system.text.encoding.getencodings.aspx

     

    En resumen, lo que hago para mandar (y funciona) es introducir el mensaje en hex en la textbox y usar los valores ascii:

     tx_buffer = hex2ascii(TextBox3.Text)

     puerto.Write(tx_buffer)

     

    y la función hex2ascii:

     Public Function hex2ascii(ByVal hextext As String) As String

            Dim num, value As String

            For y = 1 To Len(hextext)

                num = Mid(hextext, y, 2)

               value = value & Chr(Val("&h" & num))

                y = y + 1

                Next y

           Return value

        End Function

     

    Disculpas por haber iniciado el hilo en una sección errónea

     

    Saludos.


    lunes, 14 de febrero de 2011 8:53

Todas las respuestas

  • Hola:

    Puedes descargar un manual sobre el puerto serie de VB .net RS232.

    Ver manual.

    Si es enviando cadenas en C# es así:

    byte[] mBuffer = Encoding.ASCII.GetBytes("Hello World");
      serialPort1.Write(mBuffer, 0, mBuffer.Length);
    

    Saludo.


    http://electronica-pic.blogspot.com
    viernes, 11 de febrero de 2011 19:20
  • Si es enviando cadenas en C# es así:

    byte[] mBuffer = Encoding.ASCII.GetBytes("Hello World");
     serialPort1.Write(mBuffer, 0, mBuffer.Length);
    

     

    No, eso no funcionará. Encoding.ASCII usa caracteres de 7 bits, por lo que no generará correctamente los bytes cuando la cadena contenga algún Codepoint que no tenga equivalente en el juego de caracteres ASCII.

    Para enviar con fiabilidad códigos binarios arbitrarios por el puerto serie, hay que olvidarse por completo de las cadenas de caracteres, y trabajar directamente con arrays de bytes. Una vez cargado el array de bytes asignándole valores numéricos, se puede usar el método Write del serialPort para transmitirlo.

    Por cierto, debería ser obvio, pero en la configuración del puerto habrá que activar "8,N,1" (8 bits sin paridad). Si el ordenador transmite con 8,N,1 pero el receptor está configurado como "7,E,1" (7 bits con paridad) no funciionará nada bien, ya que el octavo bit será interpretado como paridad por el otro extremo y dará errores en la mitad de los caracteres.

     

    viernes, 11 de febrero de 2011 19:55
  • Si te refieres enviar tramas de bytes, en C# se hace así.

    byte[] mBuffer = new byte[5];
      mBuffer[0] = 0x74;
      mBuffer[1] = 0x75;
      mBuffer[2] = 0x89;
      mBuffer[3] = 0x20;
      mBuffer[4] = 0x6C;
      serialPort1.Write(mBuffer, 0, mBuffer.Length)
    
    Salu2.


    http://electronica-pic.blogspot.com
    • Propuesto como respuesta Metaconta lunes, 14 de febrero de 2011 14:39
    viernes, 11 de febrero de 2011 20:02
  • Está representado en hexadecimal de la tabla ASCII, puedes ponerlo enbinario.

     

    Otra cosa, este mismo tema que abriste, pertenece a otra sección del foro que puedes ver por aquí .

    http://social.msdn.microsoft.com/Forums/es-ES/devcommes/threads

    Gracias.


    http://electronica-pic.blogspot.com
    viernes, 11 de febrero de 2011 20:04
  • Gracias a todos por responder.

    Es cierto que debería trabajar con bytes en vez de con strings, cuando tenga mas tiempo cambiaré el código.

    Provisionalmente lo he resuelto con puerto.Encoding = System.Text.Encoding.GetEncoding(1252)

    Encontré una lista de valores para getencoding que permite cambiar la codificación aquí:

    http://msdn.microsoft.com/en-us/library/system.text.encoding.getencodings.aspx

     

    En resumen, lo que hago para mandar (y funciona) es introducir el mensaje en hex en la textbox y usar los valores ascii:

     tx_buffer = hex2ascii(TextBox3.Text)

     puerto.Write(tx_buffer)

     

    y la función hex2ascii:

     Public Function hex2ascii(ByVal hextext As String) As String

            Dim num, value As String

            For y = 1 To Len(hextext)

                num = Mid(hextext, y, 2)

               value = value & Chr(Val("&h" & num))

                y = y + 1

                Next y

           Return value

        End Function

     

    Disculpas por haber iniciado el hilo en una sección errónea

     

    Saludos.


    lunes, 14 de febrero de 2011 8:53
  • Muy bueno que te haya funcionado.

    Aún así, las cosas de MSDN cada vez lo ponen más al español.

    http://msdn.microsoft.com/es-es/library/system.text.encoding.getencodings.aspx

     

    Saludo.


    http://electronica-pic.blogspot.com
    lunes, 14 de febrero de 2011 14:40