在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++实现了一个串行二进制协议: | 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;

对于二进制操作,我只能提出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;
    }
  }
  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, &timestamp, 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等。此外,您的协议规范不完整,因为它没有指定网络端性,必须这样做才能发挥作用。