我正在重新工作和清理前同事的代码。我创建了一个联盟,以简化他设计的UART传输协议对消息的“解析”和“构造”。
示例消息:!cx:000:2047
第一个字符指示参数(由第二个和第三个字符定义,在本例中为cx)是应该设置(!)还是返回(?)给消息的发送方。如果需要,消息的地址部分(000)定义数组中的索引,指定的值(在本例中为2047)应该写入该数组中。命令、地址和值使用:字符分隔。
我本可以使用strtok()来使用分隔字符分隔消息,但是接收缓冲区的大小固定为12个字符,发送方函数确保消息的格式正确,并且我发现这个方法是最容易阅读和理解的。
但现在,我已经看到了this的线程,我不太确定折叠联合是否合法:
typedef union UartMessage
{
char msg[12];
struct
{
char dir; //[0]: set/get
char param[2]; //[1-2]: parameter to set/get
char separator1; //[3]: ':' separator
char addr[3]; //[4-6]: memory array index (used for current and speed arrays)
char separator2; //[7]: ':' separator
char value[4]; //[8-11]: value to set
};
} uartMsg_t;发布于 2022-06-02 09:52:27
从添加匿名结构的C11开始,这是合法的。
但是,如果没有在嵌入式结构中引入额外的填充,我建议添加一个断言。
_Static_assert(offsetof(uartMsg_t, value[4]) == 12, "extra padding");https://stackoverflow.com/questions/72473754
复制相似问题