我目前正在建立一個機器人,它有一些傳感器連接到它。機器人上的控制單元是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處理器上。
感謝您的任何提示! :)
我打算建議[Google協議緩衝](https://developers.google.com/protocol-buffers/),但您已經用這些標記了問題。是否有不使用它們的原因? – 2013-04-07 23:29:36
嗨,乍一看它看起來並不像在ARM Cortex M3上運行,但我剛發現它有一個嵌入式版本! – sled 2013-04-07 23:38:44
我已經在各種嵌入式設備(包括ARM)上成功運行GPB。這是我會做的,除非有一些困難。 – 2013-04-07 23:39:35