结构中的Dyanmic数据类型

时间:2017-02-13 04:55:34

标签: arduino

我已经定义了一些实现Modbus / RS-485应用程序注册协议的数据结构。我正在为粒子电子板编译这个。

如何向结构中添加不同的数据类型?我也尝试了(void )。这甚至可能吗?

    typedef struct {
        uint16_t registerAddress;
        uint8_t  registerSize;
        void*  dataType;
        char  description[50];
    } _rgRegister;

    static const _rgRegister PressureParameterRegister[6]={
      {0x038, 2, float, "Measured value"},
      {0x040, 1, ushort, "Parameter Id = 2 (pressure)"},
      {0x041, 1, ushort, "Units Id"},
      {0x042, 1, ushort, "Data Quality Id"},
      {0x043, 2, float, "Off line sentinel value (default = 0.0)"},
      {0x045, 1, char, "Available Units = 0x0005"}
    };

另一种选择是我声明为:

char datatype[10];

并将其传递为:

_rgRegister.datatype = "float"

我必须有一些switch语句,它可以动态地将数据类型转换为数据。

1 个答案:

答案 0 :(得分:2)

  

如何向结构中添加不同的数据类型?我也试过(无效)。这甚至可能吗?

如果数据类型有限,您可以使用enum来表示数据类型,使用union来表示数据。

enum DataType { DT_CHAR, DT_USHORT, DT_INT, DT_FLOAT, ..., };

typedef struct {
    uint16_t registerAddress;
    uint8_t  registerSize;
    DataType  dataType;
    union 
    {
       char  c;
       unsigned short us;
       int   i;
       float f;
       ...
    } data;
    char  description[50];
} _rgRegister;

static const _rgRegister PressureParameterRegister[6]={
  {0x038, 2, DT_FLOAT, 0,  "Measured value"},
  {0x040, 1, DT_USHORT, 0, "Parameter Id = 2 (pressure)"},
  {0x041, 1, DT_USHORT, 0, "Units Id"},
  {0x042, 1, DT_USHORT, 0, "Data Quality Id"},
  {0x043, 2, DT_FLOAT, 0, "Off line sentinel value (default = 0.0)"},
  {0x045, 1, DT_CHAR, 0, "Available Units = 0x0005"}
};

如果您可以选择使用boost,则可以使用boost::any来简化代码。