0

我在带有 Modbus 的嵌入式系统上使用 sqlite3。我需要将 sqlite3 的 select 语句结果中的信息打包到一个短裤数组中,以便能够通过 Modbus。

目前,我只使用来自 sqlite3 的 2 种数据类型(TEXT 和 INT)。我正在尝试将每列结果的结果打包成一个短裤数组。例如:

typedef struct
{
    short unitSN[4];
    short unitClass[1];
}UnitSettings;

UnitSettings unitSettings;

// prepare and execute select statement for table, then put into structs members
s = sqlite3_prepare(db, sqlstmt, strlen(sqlstmt), &stmt, &pzTest);
s = sqlite3_step( stmt );

// I want to do something like this:
unitSettings.unitSN[] = sqlite3_column_text(stmt, 0);
unitSettings.unitClass[] = sqlite3_column_int(stmt, 1);

我正在考虑创建函数以将 unsigned char* (sqlite3_column_text 的结果)转换为短数组并将 int 转换为短数组。这是解决问题的方法吗?或者是否有适当的方法可以即时投射这些结果?

此外,正在考虑使结构与 sqlite3 表类型匹配以便于复制,然后在最后,有一个函数来遍历每个结构成员并将其转换为最后的短裤数组。

编辑:我刚刚阅读了结构中的联合,我认为这正是我所需要的:

typedef struct
{
    union
    {
        unsigned char* unitSN;
        short unitSNArr[4]; 
    }

    union
    {
        int unitClass;
        short unitClassArr[1];
    }  
}UnitSettings;

它说现在他们都在看同一块内存,但可以以不同的方式读取它,这就是我想要的。这比任何类型的转换都容易得多,对吧?

4

1 回答 1

0

sqlite 不会自动为您提供这些转换。您必须自己进行转换。

我只会使用纯文本访问,然后编写自由函数来将访问转换为简短的。像这样的东西,不太确定哪种界面对您的访问最有意义。

void read_short(const char* data, size_t index, short& val) {
  val = *(reintepret_cast<short*>(&data[index*2]));
}

也许您的用例已经将它们放在短裤或其他东西的数组中?如果这实际上是您使用数据的方式,我可能仍然每个字段只做一个短。

就个人而言,如果您能提供帮助,我会将它们作为整数放入数据库中。您必须编写特殊工具来查看数据库值,这对维护并不十分友好。

于 2013-06-18T17:00:52.690 回答