gpt4 book ai didi

c - 在C中解析和发送数据帧

转载 作者:行者123 更新时间:2023-11-30 17:14:25 27 4
gpt4 key购买 nike

我在用 C 语言实现现有协议(protocol)时遇到了一些麻烦,特别是在创建数据包方面。

数据包如下所示:

header 数据 1(1 字节)| header 数据 2(1 字节)|长度数据(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[]中呢?以及如何连接结构中的数据以发送数据包。

有人介绍了如何创建/解析简单协议(protocol)的数据包吗?

非常感谢,

弗洛里安

最佳答案

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

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*/
}

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

关于c - 在C中解析和发送数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30355216/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com