VS2008编写tcp客户端上位机与STM32单片机通信(结构体)
2017-02-26 13:29
435 查看
一般来讲,如果上位机需要与下位机通信,最底层物理层比较常见的就是串口通信,还有一种比较方便的物理通路就是以太网。
为了通信,制定一个通信协议是很重要的,现有的需求是通过tcp上位机配置下位机的上网方式串口波特率等详细信息,简单制定了一下协议如下:
总长度已经标记出来了,是46byte,为了数据处理方便,定义一个结构体来存储数据,最初定义的结构体如下
为了测试方便,将每个结构体设置为连续的初值,再结构体赋值结束这个,调用方法:
char buffer[sizeof(frame)];
memcpy(buffer, &frame, sizeof(frame));
因为结构体在内存中是连续存放的,所以将结构体单元赋值到一直大数组里,数组的大小即为该结构体在内存的大小。
debug的时候发现,sizeof的返回值是52,其实当时就有所不理解,即使地址对齐最近的也应该是48啊,不应该是52啊!
将数组通过tcp传出来看到的结果是
其实CC就是默认填补对齐的地方,经仔细认证,除了地址对齐的原因外,还有一个原因就是结构体成员内部还有一个对齐机制,由于我编译出来的WIN32应用程序,最后编译出来的应该是4字节对齐。
以上面的出现的第一次CC为例,第一个CC出现在2425的后面2425对应的数据结构是2byte数组,后面跟着一个int类型占4字节的整形,从内存结构来看,由于WIN32是32位机器,2425正好占据的32位中的前16位,int类型默认占4位,编译器可能认为为了int类型能寻址,既占一个完整的32自己,所以上一个32位后16位它给跳过去了。。
根据以上规则,为了不传输无用的字节,得出结论:
1.结构体总长度必须是平台CPU位数的整数倍!
2.除了char类型(8位1个字节)不用考虑位对齐,其它类型必须位对齐!
综上以上规律,修改如下:
1.原来的总长度是46,由于不是4的整数倍,增加2位变为整数倍,原先起始位和终止位长度是1位,改为2位。
2.位对齐的原则,修改结构体成员的位置
修改后的结构体如下:
经测试数据已经连续,并且无无用字符出现
为了通信,制定一个通信协议是很重要的,现有的需求是通过tcp上位机配置下位机的上网方式串口波特率等详细信息,简单制定了一下协议如下:
总长度已经标记出来了,是46byte,为了数据处理方便,定义一个结构体来存储数据,最初定义的结构体如下
为了测试方便,将每个结构体设置为连续的初值,再结构体赋值结束这个,调用方法:
char buffer[sizeof(frame)];
memcpy(buffer, &frame, sizeof(frame));
因为结构体在内存中是连续存放的,所以将结构体单元赋值到一直大数组里,数组的大小即为该结构体在内存的大小。
debug的时候发现,sizeof的返回值是52,其实当时就有所不理解,即使地址对齐最近的也应该是48啊,不应该是52啊!
将数组通过tcp传出来看到的结果是
其实CC就是默认填补对齐的地方,经仔细认证,除了地址对齐的原因外,还有一个原因就是结构体成员内部还有一个对齐机制,由于我编译出来的WIN32应用程序,最后编译出来的应该是4字节对齐。
以上面的出现的第一次CC为例,第一个CC出现在2425的后面2425对应的数据结构是2byte数组,后面跟着一个int类型占4字节的整形,从内存结构来看,由于WIN32是32位机器,2425正好占据的32位中的前16位,int类型默认占4位,编译器可能认为为了int类型能寻址,既占一个完整的32自己,所以上一个32位后16位它给跳过去了。。
根据以上规则,为了不传输无用的字节,得出结论:
1.结构体总长度必须是平台CPU位数的整数倍!
2.除了char类型(8位1个字节)不用考虑位对齐,其它类型必须位对齐!
综上以上规律,修改如下:
1.原来的总长度是46,由于不是4的整数倍,增加2位变为整数倍,原先起始位和终止位长度是1位,改为2位。
2.位对齐的原则,修改结构体成员的位置
修改后的结构体如下:
经测试数据已经连续,并且无无用字符出现
相关文章推荐
- 用VB编写的上位机与嵌入式LINUX下位机的网络通信(TCP)
- socket 网络编程快速入门(一)教你编写基于UDP/TCP的服务(客户端)通信
- Java编写一个简单的TCP通信程序。服务器发送一条字符串,客户端接收该信息并显示。
- 利用TCP协议通过Socket编写的网络聊天工具1-客户端
- 客户端和服务端之间的通信(TCP)
- java编写TCP方式的通信程序
- 单片机与上位机通信元件
- 嵌入式 TCP/IP 协议单片机技术在网络通信中的应用
- 【TCP通信】多客户端连接一个服务器端总结
- C#网络编程.2.套接字.TcpListener.TcpClient.服务端客户端通信
- java 客户端与c++服务器端tcp通信 demo
- php编写socket客户端与短信猫通信
- TCP中一个客户端一个服务端通信
- C++ 简单的 Tcp 实现[socket] 客户端与客户端通信
- 利用Tcp和socket实现的客户端与服务端的简单通信
- php编写socket客户端与短信猫通信
- C++ 简单的 Tcp 实现[socket] 客户端与客户端通信
- java编写TCP方式的通信程序
- 用消息队列编写一个客户端服务器通信的程序
- C# TCP Socket通信客户端