Python: Quelle est la meilleure façon d'envoyer des bits d'état et horodatages avec pyserial

StackOverflow https://stackoverflow.com/questions/4327878

Question

J'ai fait un peu de mal de recherche et de lecture autour, mais n'a pas trouvé une réponse claire exacte. Je fais l'application python qui communiquera avec un autre sur le port série. J'utilise pyserial pour ce faire. Les types de paquets que je veux envoyer des informations d'état et des lectures de données. Je propose de former de mes paquets comme suit:

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

Bien que je ne pense pas avoir besoin de l'octet final car une longueur là-dedans. Ai-je raison?

Je pense à façonner la partie « Message » du paquet pour plus d'informations d'état comme ceci:

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

L'ID de message est ici juste pour Différencier que c'est un paquet d'état plutôt qu'un paquet de données. Les informations d'état lui-même est constitué de 16 bits, ce qui représente l'état d'un certain nombre de sous-systèmes dans l'application émettrice. Pour certains de ces sous-systèmes, un seul bit fournira assez d'informations ( « 0 » pour dire le sous-système est éteint / faible / faux, « 1 » pour le / haut / vrai). D'autres auront besoin de 2 ou 3 bits (représentant les États et autres). Prototypage le système, je suis simplement construis une chaîne concaténer les bits pour former quelque chose comme un '1001110101101100' et envoyer ce le port série, avec la somme de contrôle étant un modulo 256 des bits d'état.

Je suis assez nouveau pour la communication et Python série mais je sais que c'est probablement une perte de bande passante. Je sais que pyserial doit envoyer des chaînes, mais représentant chaque bit comme « 0 » ou « 1 » comme celui-ci utilise une représentation de chaîne complète pour chaque bit. Je me demandais quelle est la meilleure façon d'envoyer ces bits pour réduire la bande passante?

Par exemple, je prendrais chacun 8 bits, les convertir en hexadécimal et envoyer octets hexagonaux concaténés, comme dans:

'10011101' + '01101100'

comme représenté

'\x9d' + '\x6c'

ou devrais-je les envoyer en ASCII? J'ai aussi vu le module mentions du Struct. Au cas où je descendais cette route à la place?

L'autre chose que je me demande comment représenter les parties d'horodatage du message.

Toute aide, des suggestions que vous pouvez me donner serait grandement apprécié.

Merci beaucoup :)

Était-ce utile?

La solution

Eh bien, évidemment, il a besoin d'un octet par caractère SENT, donc si vous pouvez encoder vos données en tant que

string ascii (str en Python 2, bytes en Python 3), qui est le plus efficace.

Le struct est certainement une bonne idée: il emballe les données Python dans une chaîne (et il décompresse à l'autre extrémité). Ça va travailler pour votre horodatages; les emballer comme tout type d'int ou long semble approprié (voir la documentation liée à vos options).

struct ne le fait pas bits individuels, bien que, de sorte que vous aurez à faire vous-même. Je l'ai construit un dictionnaire avant de traduire les caractères en groupes de huit valeurs True / False:

Pour Décodage:

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]

Pour faire un dictionnaire pour le codage, remplacez la dernière ligne avec:

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

Si vous voulez encoder / décoder de chaînes de 1 et de 0 au lieu, remplacer le bit génération de la liste / tuple avec:

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

Autres conseils

Comment vous attendez-vous souvent d'envoyer ces mises à jour? Si update_frequency * length_of_message est beaucoup moins que le débit de données de la connexion série, alors il y a très peu de raisons de vous soucier de l'efficacité du codage des données, et vous pourriez même envisager d'étendre les choses à un format plus lisible par l'homme, en particulier lorsque vous « re commencer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top