4 votos

Enviar "cantidades más grandes de 8-bit" sobre un enlace de 8 bits

Tengo los datos que me lógicamente manipular en 12 bits cantidades que tengo que mover más de una UART enlace. (en realidad, suave serie de Mbed para PC a través de cable USB, pero eso es irrelevante)

Yo estaba pensando en usar el común 8N1 (8 bits de datos, sin paridad, 1 bit de parada) UART de instalación, que sólo me deja con la pregunta de cómo "picar" a mi 12-los valores de los bits en dos de 8 bits "paquetes".

Yo podría, por supuesto, implementar algo trivial a mí mismo como el envío de los 8 bits más bajos primero y, a continuación, envía los 4 bits más altos en el segundo paquete, con los otros 4 bits del segundo paquete no se utiliza. O podría cortarla en dos de 6 bits piezas, con los otros 2 bits de cada paquete o bien no utilizados o destinados a la meta-información (como por ejemplo, si el paquete es la primera o la segunda mitad de los 12 bits de cantidad).

Antes de hacer eso quería ver si había alguna norma o una "práctica estándar de la industria" manera de cortar de datos de más de 8 bits a 8 bits cantidades?

Velocidad de enlace debe no es un problema ya que mis necesidades son alrededor de 3 kbps.

(En la ausencia de un "bajo nivel de protocolo de comunicaciones"-Pila-de Exchange siento que esta es la plataforma más adecuada para este tipo de pregunta, por diversas discusiones sobre el Meta.)

EDIT: Todas las respuestas eran válidas y buenas. He marcado Olin de la respuesta como correcta, ya que es la manera en que me fui con mi proyecto.

16voto

Kieron Puntos 5096

Si su foco está en la búsqueda de una forma estándar para transmitir datos sobre un enlace UART hay un montón de protocolos para hacerlo. Modbus, que trabaja con registros de 16 bits viene a la mente. Habrá algunos gastos generales asociados con la formación de paquetes, pero es un estándar que es ampliamente utilizado en entornos de automatización industrial. Si el ancho de banda es una preocupación principal entonces los métodos descritos en otras respuestas aquí funcionaría bien.

5voto

RelaXNow Puntos 1164

No, no hay ningún estándar o incluso comúnmente aceptadas en la práctica.

Si usted está realmente seguro de todo lo que se envíe a través de este enlace es una corriente de 12 valores de los bits, entonces usted puede poner 6 bits en cada byte y utilizar el resto de 2 bits para identificar si este byte contiene el alta o baja de 6 bits de los 12 bits de la palabra. Que deja a los dos más códigos para un poco de expansión.

Sin embargo, eso no es lo que me gustaría, y ciertamente no es lo que suele hacer. No importa cuánto usted piensa lo contrario ahora, las posibilidades son buenas de que tarde o temprano tendrá que desea que usted podría enviar algo sobre el enlace, incluso si es sólo para la depuración. Ya que dicen ancho de banda no es un problema, hazlo ahora mismo, así que la expansión del protocolo va a ser fácil.

Lo que yo suelo hacer es enviar paquetes de datos que comienzan con un código de operación de bytes, que es seguido por los datos que va junto con el código de operación. He hecho esto muchas veces. Para mayor claridad de la documentación, que yo llamo los paquetes desde el host a la micro comandos, y desde la micro a la acogida de las respuestas, pero eso no significa que las respuestas deben ser sólo un resultado de los comandos.

Este esquema es fácil de implementar en el firmware. Es fácil en el host demasiado, pero eso no importa. Con el infinito poder de procesamiento y memoria de un PC, de cualquier protocolo se cocine hasta que esté manejable en el micro va a ser fácil en el host. El punto es mantener la sencillez en la pequeña con recursos limitados del sistema y el otro sistema se adapta según sea necesario.

En la recepción, yo uso un salto de la mesa para el código de operación de bytes. Que distribuye a la rutina único para ese comando, que sabe muchas más flujo de entrada de bytes a leer y qué hacer con ellos. Cuando está hecho, el comando de las rutinas de salto de nuevo a un común punto de retorno, que recupera el siguiente código de operación, se distribuye a través de la mesa, la cual se ejecuta el siguiente comando rutina, etc.

Una vez que este mecanismo de configurar y un programa de prueba en el host a leer y a escribir este protocolo, es realmente simple para agregar otro comando o respuesta. Al ser tan simple, vamos a empezar a utilizar este servicio en maneras que usted puede no haber imaginado al principio. Por ejemplo, usted puede hacer un comando que establece una depuración de bits en el firmware que hace que de otro código para hacer algo especial. O te das cuenta de que hay algunas opciones que le gustaría control, tal vez de leer de nuevo los datos de la memoria, un comando especial que hace algo único para las pruebas, etc, etc. Este tipo de cosas viene en muy práctico mucho.

Para resolver el caso en particular se le preguntó acerca de, usted tendría una respuesta que es seguido por 2 bytes que contienen el 12 número de bits. En el micro, que es tan simple como el envío de la respuesta opcode byte seguido por los dos bytes de datos periódicamente. Mientras tanto, se deja abierta la opción de envío de otras cosas, sin echar a perder la secuencia de 12 valores de los bits.

2voto

Alex Andronov Puntos 178

Si lo único que se va a enviar a través de enlace es su valor de 12 bits, puede ser muy útil para enviar como dos bytes, los cuales son elegidos de tal manera que el código que recibe dos bytes consecutivos será capaz de identificarlos como parte de la misma lectura, o partes de las dos lecturas consecutivas. Una forma común de hacer esto es utilizar un bit para identificar si un determinado byte representa el inicio de un elemento de datos o una continuación de la misma. Por ejemplo, puede especificar que una lectura constará de un byte cuyos 3 primeros bits son 100 y cuya parte inferior de cinco bits que representan el top 5 de los bits de un 12 bits de lectura, seguido por un byte cuya parte superior bit es cero y cuya parte inferior de 7 bits que representan la parte inferior de 7 bits de 12 bits de lectura. Tenga en cuenta que este enfoque puede funcionar bien si hay varios sensores. Por ejemplo, se puede especificar que un top-3-bits valor de 100, 101, 110 representará el inicio de uno de los tres 12-bits de los sensores de 12 bits lecturas, dejando espacio para una mayor expansión.

1voto

Andrew Walker Puntos 9038

Cuando el total de la información a transferir es de menos de un número entero de bytes, la idea de reservar un poco para el encuadre es realmente atractivo, que he utilizado en el pasado.

Por supuesto, hay otros enmarcado en los planes de uso, que puede tener sentido cuando más datos se deben mover. La representación ASCII con un carácter de terminación es también vale la pena considerar, ya que además de resolver el encuadre, el problema que le da legible de los datos, a pesar de que en un 2x sobrecarga.

Ya que usted menciona USB, puede ser vale la pena considerar si un USB-serial de transporte puede dar implícita la definición de una especie que no está presente en un verdadero enlace serial. De datos en el USB paquetes de posición conservada, (es decir, ambos extremos pueden identificado que es el primer byte del paquete de la carga) así que la verdadera pregunta no es si el host en particular los conductores de aceptar/presentan los datos de/para aplicaciones con consistencia que puede ser utilizado para enmarcar. Por supuesto, si el incrustados final tiene un traductor alimentación de un real UART, el encuadre de la información (más allá de la ambigua de detección de inactividad) se pierde en ese punto.

1voto

shash Puntos 668

Me encanta utilizar c sindicatos para cosas como esta. Manejar los datos como int16s y les en cambio como int8s sin problemas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X