3

ネットワーク経由で送信される列挙値をシリアル化する必要があります。送信部分は C で記述され、8 ビットのマイクロコントローラーで実行されます。プロトコル バッファーや同様のライブラリは利用できません。受信部分は C++ (Linux) です。私は次のアプローチを試しました:

enum enum_x {
    V1 = 1,
    V2 = 2,
};

enum enum_y {
    V3 = 1,
    V4 = 2,
    V5 = 3,
};

enum enum_z {
    V6 = 1,
    V7 = 2,
    V8 = 3,
};

uint8_t serialize_enums(enum_x x, enum_y y, enum_z z) {
    return x * 100 + y * 10 + z;
}

しかし、それは有効ではないようです。私の Linux ボックスでは問題なく動作しますが、8 ビット システムでは結果が正しくありません (y 値は z として保存されているようで、z 値がありません)。キャストを追加しようとしました:

return (uint8_t)x * 100 + (uint8_t)y * 10 + (uint8_t)z;

しかし、それは役に立ちませんでした。正しいアプローチは何ですか?

4

1 に答える 1

0

それらをフィールドで送信したい場合は8-bit、各に0〜3の値を許可しますenum。私は次のようにします:

#include <iostream>
#include <cstdint>

struct s_enum_t
{
   s_enum_t(
      int x,
      int y,
      int z)
      : x_(x)
      , y_(y)
      , z_(z)
   {}

   union
   {
      struct
      {
         uint8_t x_ : 2;
         uint8_t y_ : 2;
         uint8_t z_ : 2;
         uint8_t spare_ : 2;
      };
      uint8_t val;
   };
};

int main()
{
   s_enum_t v(1, 1, 1);

   std::cout << v.val << "\n";
}

これにより、非常に具体的な方法で値が配置されます。ただし、異なるシステム間で送信する場合は、各システムのエンディアン スキームに注意する必要があります。

明確にするために、個々の列挙値を に配置すると2-bits、送信システムと受信システムの間の問題のトラブルシューティングが容易になります。この特定のケースでは、値を適切にデコードする方法を知るために、これが (コンパイラによって) 各システムでどのように配置されるかをよく理解しておく必要があります。(デバッグ目的で) 出力できるビットフィールドに個別の値を設定すると、最初のシステム統合テストを実行するときに、どのフィールドがどのフィールドであるかを簡単に識別できます。

于 2012-10-18T14:49:44.940 に答える