用于在C中发送大量值的代码结构

时间:2014-02-21 13:27:13

标签: c structure protocols uart

我正在制作一个机器人,它应该通过UART(串行通信,调制解调器端口)为桌面上的各种值进行简单的双向通信。它也很容易添加新值。

机器人上的电路板是一个Olimexino,一个相当强大的带有臂处理器的Arduino克隆。为简单起见,我认为将所有相关的全局值存储为浮点数是可以负担的。

我的想法是将所有值存储在矩阵中,如下所示。例如,在机器人上我想要多个控制器,这里可以看作是一组分组的值。这些应该易于修改和发送。

  enum rows
  {
     controller_a, 
     controller_b,
     controller_c,
     rows
  }

  enum controllers
  {
     controller_value1,
     controller_value2,
     columns
  }

  float values[rows][columns]

这应该可以很容易地添加一个控制器。发送和插入值也相当容易,因为我可以通过将坐标发送为[row,column]来定位任何值。

问题是,还有其他更好的方法吗?

我是否应该在结构中定义控制器

  struct controller
  {
      float controller_value1;
      etc

  }controllers[columns];

如果我确保所有控制器值都是浮点数,也许我可以使用指向结构的指针以便于读/写?我不知道如何做指针aritmethics。我想它需要一个特定的例程来处理每个不同的结构,这意味着代码不容易修改?

1 个答案:

答案 0 :(得分:2)

首先,如果要在设备之间发送数据,使用浮点数是一个非常糟糕的主意,特别是如果它们将采用不同的体系结构,那么使用64位整数和必要时手工实施固定点。浮点数在内存中的格式不可预测,因此尝试序列化它们非常困难。

其次,我认为就存储数据而言,你有一些合理的想法,使用固定类型的2D数组存储数据将很好地工作,并希望得到很好的优化。枚举也是避免混淆的好方法。但是你缺少的是一种轻松发送它们的方法。正如您使用微型协议所做的那样,我可以根据以下内容提出建议。这假设您保持表在计算机和arduino之间同步:

uint64_t ValueTable[CONTROLLER_MAX][VALUE_MAX];
uint32_t UartFD; // This gets set somewhere during init
// It should be a non blocking fd so we dont block if there are
// no value changes

void SetValue(uint32_t ControllerNum, uint32_t ValueIndex, uint64_t Value)
{
    ValueTable[ControllerNum][ValueIndex] = Value;
    write(UartFD, &ControllerNum, sizeof(uint32_t));
    write(UartFD, &ValueIndex, sizeof(uint32_t));
    write(UartFD, &Value, sizeof(uint64_t));
}

void GetValue(void)]
{
    uint32_t ContNum;
    uint32_t ValIndx;
    uint64_t Value;
    if(!read(UartFD, &ContNum, sizeof(uint32_t)))
    {
        // No data waiting
        return;
    }
    // Wait for the rest
    while(!read(UartFD, &ValIndx, sizeof(uint32_t)));
    while(!read(UartFD, &Value, sizeof(uint64_t)));
    ValueTable[ContNum][ValIndx] = Value;
}

显然这是PC的版本,arduino需要读取和写入替换为Serial.read和Serial.write并且不需要第一个参数,否则两者是相同的。显然你需要在任何地方调用它们写入表中的值。

有效地实现您的想法是非常好的,只需确保快速简单地实现,以便在机器人的嵌入式系统上运行良好。 Yuo不必过于担心可扩展性,因为您可能会立即更新两者,特别是如果您可以在PC和机器人之间保留相当数量的公共代码。