gpt4 book ai didi

c++ - 远程读写结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:26 26 4
gpt4 key购买 nike

我目前正在构建一个附有一些传感器的机器人。机器人上的控制单元是 ARM Cortex-M3,所有传感器都附在上面,并通过以太网连接到“地面站”。

现在我想通过地面站读写机器人的设置。于是我想到了在机器人上实现一个可以被地面站操控的“虚拟寄存器”。

它可以由结构组成,看起来像这样:

// accelerometer register
struct accel_reg {
// accelerations
int32_t accelX;
int32_t accelY;
int32_t accelZ;
};

// infrared distance sensor register
struct ir_reg {
uint16_t dist; // distance
};

// robot's register table
struct {
uint8_t status; // current state
uint32_t faultFlags; // some fault flags
accel_reg accelerometer; // accelerometer register
ir_reg ir_sensors[4]; // 4 IR sensors connected
} robot;

// usage example:

robot.accelerometer.accelX = -981;
robot.ir_sensors[1].dist = 1024;

在机器人上,寄存器将不断填充新值,配置设置由地面站设置并由机器人应用。

地面站和机器人将用 C++ 编写,因此它们可以使用相同的结构数据类型。

问题 我现在的问题是如何在不写入大量元数据的情况下将读/写操作封装在协议(protocol)中?

假设我想读取寄存器 robot.ir_sensors[2].dist。我将如何在我的协议(protocol)中处理这个寄存器?

我已经考虑过以字节为单位传输相对偏移量(即结构内内存中的相对位置),但我认为内存对齐和填充可能会导致问题,特别是因为地面站运行在 x86_64 架构上,而机器人运行在32 位 ARM 处理器。

感谢任何提示! :)

最佳答案

我还将推荐 Google Protocol Buffers。

在最简单的情况下,您可以像这样实现一条消息 RobotState:

message RobotState {   optional int32_t status = 1;   optional int32_t distance = 2;   optional int32_t accelX = 3;   ...}

然后,当机器人收到消息时,它将从存在的任何可选字段中获取新值。然后它将回复一条包含所有字段当前值的消息。

通过这种方式,使用大多数 protobuf 实现的“合并消息”功能可以很容易地实现字段更新。此外,您可以在开始时使其非常简单,因为您只有一种消息类型,但如果以后需要扩展,您可以添加子消息。

protobuf确实不支持int8_t或者int16_t。只需使用 int32_t 即可。

关于c++ - 远程读写结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15869074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com