Principales respuestas
Caracteres ASCII (8 bits) por el serialport.

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)
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.
- Marcado como respuesta Eduardo PorteschellerModerator martes, 15 de febrero de 2011 16:43
Todas las respuestas
-
Hola:
Puedes descargar un manual sobre el puerto serie de VB .net RS232.
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 -
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.
-
Si te refieres enviar tramas de bytes, en C# se hace así.
Salu2.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)
http://electronica-pic.blogspot.com- Propuesto como respuesta Metaconta lunes, 14 de febrero de 2011 14:39
-
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 -
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.
- Marcado como respuesta Eduardo PorteschellerModerator martes, 15 de febrero de 2011 16:43
-
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