我目前正在构建一个带有一些传感器的机器人。机器人上的控制单元是 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++ 编写,因此它们都可以使用相同的结构数据类型。
我现在的问题是如何在不写入大量元数据的情况下将读/写操作封装在协议中?
假设我想读取寄存器robot.ir_sensors[2].dist
。我将如何在我的协议中处理这个寄存器?
我已经考虑过以字节为单位传输相对偏移量(即结构内内存中的相对位置),但我认为内存对齐和填充可能会导致问题,特别是因为地面站运行在 x86_64 架构上,而机器人运行在 32-位 ARM 处理器。
感谢您的任何提示!:)