【问题标题】:parsing and sending dataframes in C在 C 中解析和发送数据帧
【发布时间】:2015-05-21 02:40:58
【问题描述】:

我在用 C 语言实现现有协议时遇到了一些麻烦,尤其是在创建数据包时。

数据包如下所示:

HeaderData 1(1Byte) | HeaderData 2(1 字节) | Length_Data (2 字节) |数据(长度变量)

我通过串口获取一些数据并保存在returnMessage中:

int getMessage(char * returnMessage){
int length = 0;
//static char replay[REPLAY_MAX_SIZE];
memset(replay, 0x00, REPLAY_MAX_SIZE);
// goes into the while-loop, if some data comes in
// after a timeout of 20 seconds the program will be terminated
if(select(fd +1 , &set, NULL, NULL, &timeout )){
    length = read(fd, returnMessage, REPLAY_MAX_SIZE);
    //reinitialize fd_set values
    FD_ZERO(&set);
    FD_SET(fd, &set);
    return length;
    }
    //printf("[%s] ERROR CANNOT GET MESSAGE\n", __FUNCTION__);
return -1;
}

returnMessage 中的这些数据我将增强到我的数据包以进一步发送它。但我不知道怎么做。

也许有一种使用结构的方法?

struct Packet{
   char header1[1];
   char header2[2];
   char lengthData[20];
   char data[MAX_DATA_LENGTH];
};

struct Packet packet;

但是如何将returnMessage 中的数据复制到packet.data[]?以及如何连接结构中的数据以发送数据包。

有人介绍过为简单协议创建/解析数据包吗?

非常感谢,

弗洛里安

【问题讨论】:

  • memcpy()?这实际上与“协议”之类的东西无关。

标签: c struct protocols


【解决方案1】:

假设您在 char 缓冲区 (*) 中获得了完整的数据包,那么就很简单了:

struct Packet{
   char header1[1];
   char header2[2];
   short lengthData;
   char data[MAX_DATA_LENGTH];
};

void buftopacket(char *buffer, Packet *pkt) {
    pkt->header1 = buffer[0];
    pkt->header2 = buffer[1];
    pkt->lengthData = buffer[2] << 8 + buffer[3]; /* assuming network order */
    memcpy(pkt->data, buffer + 4, (pkt->lengthData <= MAX_DATA_LENGTH)
        ? pkt->lengthData : MAX_DATA_LENGTH); /* do not write pass buffer end*/
}

(*) 但没有什么能确保您在一次读取中获得完整的数据包...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2019-11-03
    相关资源
    最近更新 更多