2010-04-15 11 views
8

Estoy trabajando en un sistema integrado, y estoy teniendo dramas para enviar un cierto trozo de datos a través del puerto serie. Lo reduje y descubrí que si hay un 0x9B presente en el mensaje, corrompe el mensaje.¿Es 0x9B (155decimal) un personaje de control especial? ¿Por qué falta en las tablas ascii?

Entonces busco 0x9b (155) en http://www.asciitable.com/, ¡y me falta! ¿No es una extraña coincidencia?

Alguna idea, ¿es este un personaje especial o algo así?

-edito- Muy bien muchachos, no fue el 0x9b el que causó esto, era un personaje de 0x11. Que ... drumroll ... es un personaje XON/XOFF. ¡Por error controlé el flujo como xon/xoff en la computadora y no controlé el flujo en el dispositivo! De todas formas, gracias por la ayuda.

+7

ASCII solo sube a 127 (0x7f hex). –

+1

Bueno, ascii extendido si quieres. – Chris

+0

¿Cómo es la corrupción? ¿Se rompe la conexión o se obtiene una secuencia de bytes que no coincide con la entrada? En ese caso, ¿cómo se ve? –

Respuesta

1

Supongo que se trata de un 0x1B, es decir, el carácter de escape ASCII, con un bit de paridad en la posición de 8 bits (viene de la comunicación en serie y todo).

Técnicamente, los caracteres del conjunto ASCII son todos menores o iguales a 0x7F, caracteres entre 0x80 a 0xFF son parte de la extendido ASCII. El significado de los códigos superiores a 0x7F generalmente varía, permitiendo que uno de los conjuntos de caracteres múltiples se maneje con códigos de un tamaño de un byte. Desafortunadamente, esta capacidad introduce ambigüedad, ya que uno necesita conocer el conjunto de caracteres extra particular en uso (la "página de códigos" si lo desea).
Por ejemplo, la tabla "ASCII" a la que se hace referencia en la pregunta no parece tener ningún carácter asociado con 0x9B, mientras que muchos otros conjuntos ASCII extendidos usan esto para un carácter "simple"/visualizable (por ejemplo, un carácter de búsqueda > en ISO -8859-1, el signo de centavo (un carácter similar a c) con otro conjunto, etc.

El posible significado del carácter 0x9B podría depender del carácter [implícito] configurado en uso con la aplicación subyacente. dicho anteriormente, parece que los caracteres están codificados en 7 bits (por lo tanto, son caracteres ASCII "puros") con un bit de paridad.

+0

Hmm, no estoy tan seguro: mi configuración de comunicaciones es 8N1 - 8 bits, sin paridad, 1 bit de parada – Chris

+0

@Chris, podría ser un bit de paridad _logical_, es decir, uno administrado al nivel del archivo/contenido, no uno agregado con el dispositivo de comunicación en serie. (Tipo de una configuración de "cinturón + tirantes" si el serial com también incluye un bit de paridad). Puede verificar esto afirmando que, por ejemplo, nunca tiene 0x41 o 0x42 (sino 0xC1 y 0xC2 respectivamente) y que, a la inversa, siempre tener 0x43 (y nunca 0xC3). (Adivina ...) – mjv

+0

@Chris: recuerde también que no se debe a que un lado de la comunicación en serie esté configurado como 8 bits sin paridad, que el otro lado no podría ser de 7 bits más paridad ... (pensando por segunda vez) , posiblemente extraño, literalmente, ya que normalmente los coms de serie usan un bit de paridad par, no una paridad impar ...) – mjv

6

En secuencias de escape ANSI, 0x9B es el carácter Control Sequence Introducer (la versión de caracteres múltiples que es más familiar es ESC-[.

2

0x9B es la CSI o "Secuencia de control Introductor" su parte del conjunto de C1 de códigos de control, ver aquí: http://www.search.com/reference/C0_and_C1_control_codes

Asumiendo los datos se pasan a través de una capa que procesa los códigos de control C1 que no es sorprendente que hay faltan unos pocos bytes después de este carácter, ya que se utiliza para indicar el comienzo de una secuencia de escape ansi. Los bytes están desapareciendo porque alguna capa los está eliminando como parte de una instrucción. Más información al respecto aquí: http://en.wikipedia.org/wiki/Control_Sequence_Introducer

Obviamente no puedo garantizar que este sea su problema, pero es donde comenzaría a buscar en la documentación de API según los síntomas que describió.

2

Si el carácter anterior a 0x9B es 0x10 (DLE - carácter de escape de enlace de datos) que podría explicar los caracteres perdidos que ve. Algunos dispositivos usan DLE como un indicador de comando de control y el siguiente es el comando. Si no se escapan los caracteres DLE, el signo habitual es una pérdida de 2 caracteres en la transmisión o un comportamiento extraño del dispositivo. Escape personajes DLE con DLE.Así, en su caso, si su flujo de datos incluye:

... 0x10 0x9b ...

que tendría que escribir

... 0x10 0x10 0x9b ...

0

Para cualquiera que llegue a esta pregunta solo por el título: 0x9B/155 falta en las tablas ASCII porque no es un carácter ASCII. Los caracteres ASCII son sólo 7 bits de ancho, lo que significa que sólo hay 128 de ellos, simplemente es ningún carácter 155.

[Wiki de la Comunidad, ya que en realidad no responde a la pregunta, sólo el título.]

+0

Bueno, 154 y 156 están en la tabla ascii que estaba viendo, solo faltaban 155! De todos modos, descubrí el problema, era un error de configuración xon/xoff. – Chris

Cuestiones relacionadas