私はかなりの検索と読書をしましたが、正確な明確な答えは見つかりませんでした。シリアルポートを介して別のアプリケーションと通信する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 つのことは、メッセージのタイムスタンプ部分を表す方法です。
あなたが私に与えることができるどんな助け、提案も大歓迎です。
どうもありがとう :)