我正在制作一个机器人,它应该通过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。我想它需要一个特定的例程来处理每个不同的结构,这意味着代码不容易修改?
答案 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和机器人之间保留相当数量的公共代码。