发送结构体数据转序

上一篇程序后来调试接收数据发现,收到的数据存在问题,Byte单字节的数据类型没有问题,但是如果是WORD类型双字节以上的类型,接收端从串口收到的数据高低位是反的,这里就存在一个主机序和网络序的问题。

具体的转序规则对于不同的系统规则是不同的,后面文章继续补充出来。

希望有用python操作串口的同学留言讨论,也希望上一篇文章不要让看到的同学徘徊不前,在上一篇文章中,最后通过mem操作来“封装的数据”,通过后来的实践发现,这种方式虽然可行,但是需要转序操作要先转好再“封装”,无论从繁琐性和程序的移植性来看都是不推荐的,所以后来采用了struct.pack的方法,贴一段代码示例:

buffer_restore = struct.pack('>HHHBBHHBBBBLBBBBB',
ScreenControl_stru_restore.wPakageHeader,
ScreenControl_stru_restore.wLength,
ScreenControl_stru_restore.struAddress.wHostAddress,
ScreenControl_stru_restore.struAddress.byRes[0],
ScreenControl_stru_restore.struAddress.byRes[1],

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用UDP协议发送结构体数据时,需要将结构体数据序列化为二进制数据,然后通过UDP协议发送出去。以下是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8888 typedef struct { int id; char name[20]; float score; } Student; int main() { // 创建UDP socket int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); exit(1); } // 设置服务器地址 struct sockaddr_in servaddr; bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERVER_PORT); if (inet_pton(AF_INET, SERVER_IP, &servaddr.sin_addr) <= 0) { perror("inet_pton"); exit(1); } // 准备结构体数据 Student stu; stu.id = 1; strcpy(stu.name, "Tom"); stu.score = 90.5; // 将结构体数据序列化为二进制数据 char buf[sizeof(Student)]; memcpy(buf, &stu, sizeof(stu)); // 发送数据 if (sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { perror("sendto"); exit(1); } // 关闭socket close(sockfd); return 0; } ``` 在上面的示例代码中,我们定义了一个结构体 `Student`,然后将其序列化为二进制数据,通过UDP协议发送出去。接收可以将接收到的二进制数据反序列化为结构体数据。当然,在实际应用中,我们可能需要对结构体数据进行字节序转换等操作,以保证不同机器之间的数据传输正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值