在C++; 我用C++实现了一个串行二进制协议: | sync word (0xAA) | sync word (0xBB) | message length (2 bytes) | device id (4 bytes) | message type (1 byte) | timestamp (4 bytes) | payload (N bytes) | crc (2 bytes) |
对于二进制操作,我只能提出C风格的方法。例如,使用在C++; 我用C++实现了一个串行二进制协议: | sync word (0xAA) | sync word (0xBB) | message length (2 bytes) | device id (4 bytes) | message type (1 byte) | timestamp (4 bytes) | payload (N bytes) | crc (2 bytes) |,c++,protocols,C++,Protocols,对于二进制操作,我只能提出C风格的方法。例如,使用memcpy提取具有预定义偏移量的每个字段: void Parse(string data) { bool found_msg_head = false; int i=0; for (; I<data.size()-1; i++) { if (data[i] == 0xAA && data[i+1] == 0xBB) { found_msg_head = true; break;
memcpy
提取具有预定义偏移量的每个字段:
void Parse(string data) {
bool found_msg_head = false;
int i=0;
for (; I<data.size()-1; i++) {
if (data[i] == 0xAA && data[i+1] == 0xBB) {
found_msg_head = true;
break;
}
}
if (found_msg_head) {
uint16_t msg_length;
uint32_t device_id;
// declare fields ...
memcpy(&msg_length, data.c_str()+i+2, 2);
memcpy(&device_id, data.c_str()+i+4, 4);
// memcpy to each field ...
// memcpy crc and validate...
}
}
void SendMsg(const MyMsg& msg)
{
const uint16_t msg_len = sizeof(msg) + 16;
const uint32_t dev_id = 0x01
const uint32_t timestamp = (uint32_t)GetCurrentTimestamp();
const uint8_t msg_type = 0xAB;
char buf[msg_len];
buf[0] = 0xAA;
buf[1] = 0xBB;
memcpy(buf + 2, &msg_len, sizeof(msg_len));
memcpy(buf + 4, &dev_id, sizeof(dev_id));
memcpy(buf + 8, ×tamp, sizeof(timestamp));
memcpy(buf + 12, &msg_type, sizeof(msg_type));
memcpy(buf + 13, &g_msg_num, sizeof(g_msg_num));
memcpy(buf + 14, &msg, sizeof(msg));
uint16_t crc = CalculateCrc16((uint8_t*)buf, sizeof(DevSettingMsg) + 14);
memcpy(buf + sizeof(buf) - 2, &crc, 2);
std::string str(buf, sizeof(buf));
// send str to serial port or other end points...
}
void解析(字符串数据){
bool found\u msg\u head=false;
int i=0;
对于(;I二进制通信协议因需要大量易出错的样板代码而臭名昭著。我强烈建议查看现有的库和/或代码生成解决方案,这可能非常适合。我建议尽可能记录您的协议。
该规范可能是鼓舞人心的
您是否考虑重新使用现有的通信协议?例如,您关心异构系统和不同大小字的机器之间的通信(例如与Linux或PowerPC或LINUX/X8664服务器进行通信)?
<>你可以使用C++代码生成器,比如C代码生成器,或者在某些情况下编写自己的C++代码生成器(也许借助于或)或< /P>
您可以使用(或修改)现有的C++框架,比如(实现邮件相关协议)
您可以将现有的Web服务协议(HTTP-like)与库(如或)一起使用。除了实际的消息负载之外,我不会使用memcpy进行任何操作。其余的都在固定的位置,大小固定,坦率地说,可以手工组装,一个八位字节一个八位字节。另外,您还可以控制平台端的期望值(不管怎样,你都应该这样做,但我看不到有证据或努力这样做)。至少要确保你的机器的字节顺序与协议的字节顺序一致(即:2字节数字是如何编码的?)。什么是“串行”?协议的性质取决于您使用的实际总线:UART、SPI、CAN等。此外,您的协议规范不完整,因为它没有指定网络端性,必须这样做才能发挥作用。