Pregunta

He hecho un poco de búsqueda y lectura de alrededor, pero no han encontrado una respuesta clara exacta. Estoy haciendo aplicación de pitón que comunicarse con otro a través del puerto serie. He estado usando PySerial para lograr esto. Los tipos de paquetes que desea enviar información de estado y son lecturas de datos. Estoy proponiendo para formar de mis paquetes de la siguiente manera:

[ Start Byte ][ Length ][ Message ][ End Byte ][ Checksum ]

A pesar de que no creo que necesita el byte final, ya que tienen una longitud de allí. Estoy en lo correcto?

Estoy pensando en dar forma parte del 'mensaje' del paquete de información de estado, así:

[ MsgTypeID ][ PacketID ][ Status Bits ][ Timestamp ]

El ID de mensaje aquí es sólo para diferenciar que este es un paquete de estado en lugar de un paquete de datos. La información de estado en sí se compone de 16 bits, que representa el estado de un número de subsistemas en la aplicación de envío. Para algunos de estos subsistemas, un solo bit proporcionará suficiente información ( '0' para decir que el subsistema está apagado / bajo / falso, '1' para encendido / alto / verdad). Otras requieren 2 o 3 bits (estados que representan y tal). Creación de un prototipo del sistema, yo he estado simplemente creando una cadena concatenar los bits hasta formar algo así como un '1001110101101100' y el envío de esta a través del puerto serie, con la suma de comprobación ser un módulo 256 de los bits de estado.

Soy bastante nuevo en Python y la comunicación en serie pero sé que esto es probablemente una pérdida de ancho de banda. Yo sé que PySerial tiene que enviar cadenas, sino que representa cada bit como un '0' o '1' como esto está utilizando una representación de cadena completa para cada bit. Me preguntaba cuál es la mejor manera de enviar estos bits para reducir el ancho de banda?

Por ejemplo, me gustaría tomar cada 8 bits, ellos convertir a hexadecimal y enviar bytes hexadecimales concatenados, como en:

'10011101' + '01101100'

representado como

'\x9d' + '\x6c'

o debería enviarlos como ASCII? También he visto menciones del módulo Struct. ¿Debo estar recorriendo esta vía en su lugar?

La otra cosa que me pregunto es cómo representar las partes de fecha y hora del mensaje.

Cualquier ayuda, sugerencia que me puede dar sería muy apreciada.

Muchas gracias :)

¿Fue útil?

Solución

Bueno, es obvio que necesita un byte por carácter enviado, así que si usted puede codificar sus datos como una cadena ASCII (str en Python 2, bytes en Python 3), que es más eficiente.

El estructura módulo es definitivamente una buena idea: que los paquetes de datos de Python en una cadena (y desempaqueta que en el otro extremo). Eso funcionará para sus marcas de tiempo; paquete de ellos como cualquier tipo de int o largo parece adecuado (vea la documentación vinculada a sus opciones).

struct no hacerlo bits individuales, aunque, por lo que tendrá que hacerlo usted mismo. He construido un diccionario antes de traducir los caracteres en grupos de ocho valores True / False:

Para decodificar:

pot = [2**x for x in range(8)]  # Powers of 2 (bytes with one 1 and seven 0s)
bitvalues = {}
for x in range(256):
    bitvalues[chr(x)] = [(x & y) != 0 for y in pot]

Para hacer un diccionario para la codificación, en lugar de la última línea con:

bitvalues[tuple((x & y) != 0 for y in pot)] = chr(x)

Si desea envío / recepción de cadenas de 1s y 0s lugar, sustituir el bit de la generación de la lista / tupla con:

"".join("1" if (x&y) else "0" for y in pot)

Otros consejos

¿Con qué frecuencia estás esperando para enviar estas actualizaciones? Si update_frequency * length_of_message es mucho menor que la velocidad de datos de la conexión en serie, entonces hay muy pocas razones para preocuparse por la eficiencia de la codificación de los datos, y que incluso podría considerar la expansión de las cosas a un formato más legible, especialmente cuando se estés empezando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top