您的位置:首页 > 理论基础 > 计算机网络

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.位对齐的原则,修改结构体成员的位置

修改后的结构体如下:



经测试数据已经连续,并且无无用字符出现



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: