0

私はかなりの検索と読書をしましたが、正確な明確な答えは見つかりませんでした。シリアルポートを介して別のアプリケーションと通信するpythonアプリケーションを作成しています。これを達成するために PySerial を使用しています。送信したいパケットの種類は、ステータス情報とデータ読み取りです。私は次のようにパケットを形成することを提案しています:

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

そこには長さがあるので、最後のバイトは必要ないと思いますが。私は正しいですか?

ステータス情報のパケットの「メッセージ」部分を次のように整形することを考えています。

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

ここでのメッセージ ID は、これがデータ パケットではなくステータス パケットであることを区別するためのものです。ステータス情報自体は 16 ビットで構成され、送信側アプリケーションの多数のサブシステムの状態を表します。これらのサブシステムの一部では、1 ビットで十分な情報が得られます (サブシステムがオフ/低/偽であることを示すには「0」、オン/高/真であることを示すには「1」)。他のものは 2 または 3 ビット (状態などを表す) を必要とします。システムのプロトタイプを作成して、ビットを連結して何かを形成し、'1001110101101100'これをシリアル ポートから送信する文字列を作成しました。チェックサムはステータス ビットのモジュロ 256 です。

私はPythonとシリアル通信にかなり慣れていませんが、これはおそらく帯域幅の無駄であることを知っています. PySerial が文字列を送信する必要があることは知っていますが、このように各ビットを「0」または「1」として表すと、各ビットに完全な文字列表現が使用されます。帯域幅を減らすためにこれらのビットを送信する最良の方法は何だろうと思っていましたか?

たとえば、次のように、各 8 ビットを取得して 16 進数に変換し、連結された 16 進数のバイトを送信します。

'10011101' + '01101100'

として表される

'\x9d' + '\x6c'

またはASCIIとして送信する必要がありますか?Struct モジュールについての言及も見ました。代わりにそのルートをたどるべきですか?

私が疑問に思っているもう 1 つのことは、メッセージのタイムスタンプ部分を表す方法です。

あなたが私に与えることができるどんな助け、提案も大歓迎です。

どうもありがとう :)

4

2 に答える 2

0

明らかに、送信される文字ごとに 1 バイトが必要なので、データを ascii 文字列 ( strPython 2 ではbytesPython 3) としてエンコードできれば、それが最も効率的です。

structモジュールは間違いなく良いアイデアです: Python データを文字列にパックします (そして、反対側でアンパックします) 。これはタイムスタンプで機能します。int または long のタイプが適切と思われるものとしてそれらをパックします (オプションについては、リンクされたドキュメントを参照してください)。

ただし、構造体は個々のビットを実行しないため、自分で実行する必要があります。True文字を 8 つの/False値のグループに変換するために、以前に辞書を作成しました。

デコードするには:

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]

エンコーディング用の辞書を作成するには、最後の行を次のように置き換えます。

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

代わりに 1 と 0 の文字列からエンコード/デコードする場合は、リスト/タプルを生成するビットを次のように置き換えます。

"".join("1" if (x&y) else "0" for y in pot)
于 2010-12-01T19:05:31.580 に答える
0

これらの更新をどのくらいの頻度で送信する予定ですか? update_frequency * length_of_message がシリアル接続のデータ レートよりもはるかに小さい場合、データ エンコーディングの効率を心配する理由はほとんどなく、人間が読める形式に拡張することを検討することさえできます。始めています。

于 2010-12-01T19:49:07.090 に答える