打印
[应用相关]

VS2008编写tcp客户端上位机与STM32单片机通信(结构体)

[复制链接]
524|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wakayi|  楼主 | 2019-7-6 16:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

一般来讲,如果上位机需要与下位机通信,最底层物理层比较常见的就是串口通信,还有一种比较方便的物理通路就是以太网。

为了通信,制定一个通信协议是很重要的,现有的需求是通过tcp上位机配置下位机的上网方式串口波特率等详细信息,简单制定了一下协议如下:


使用特权

评论回复
沙发
wakayi|  楼主 | 2019-7-6 16:53 | 只看该作者

总长度已经标记出来了,是46byte,为了数据处理方便,定义一个结构体来存储数据,最初定义的结构体如下


使用特权

评论回复
板凳
wakayi|  楼主 | 2019-7-6 16:53 | 只看该作者
为了测试方便,将每个结构体设置为连续的初值,再结构体赋值结束这个,调用方法:

char buffer[sizeof(frame)];
memcpy(buffer, &frame, sizeof(frame));

因为结构体在内存中是连续存放的,所以将结构体单元赋值到一直大数组里,数组的大小即为该结构体在内存的大小。
debug的时候发现,sizeof的返回值是52,其实当时就有所不理解,即使地址对齐最近的也应该是48啊,不应该是52啊!

使用特权

评论回复
地板
wakayi|  楼主 | 2019-7-6 16:54 | 只看该作者
将数组通过tcp传出来看到的结果是



其实CC就是默认填补对齐的地方,经仔细认证,除了地址对齐的原因外,还有一个原因就是结构体成员内部还有一个对齐机制,由于我编译出来的WIN32应用程序,最后编译出来的应该是4字节对齐。

以上面的出现的第一次CC为例,第一个CC出现在2425的后面2425对应的数据结构是2byte数组,后面跟着一个int类型占4字节的整形,从内存结构来看,由于WIN32是32位机器,2425正好占据的32位中的前16位,int类型默认占4位,编译器可能认为为了int类型能寻址,既占一个完整的32自己,所以上一个32位后16位它给跳过去了。。


使用特权

评论回复
5
wakayi|  楼主 | 2019-7-6 16:54 | 只看该作者

根据以上规则,为了不传输无用的字节,得出结论:

1.结构体总长度必须是平台CPU位数的整数倍!

2.除了char类型(8位1个字节)不用考虑位对齐,其它类型必须位对齐!


使用特权

评论回复
6
wakayi|  楼主 | 2019-7-6 16:54 | 只看该作者

综上以上规律,修改如下:

1.原来的总长度是46,由于不是4的整数倍,增加2位变为整数倍,原先起始位和终止位长度是1位,改为2位。

2.位对齐的原则,修改结构体成员的位置

修改后的结构体如下:


使用特权

评论回复
7
wakayi|  楼主 | 2019-7-6 16:55 | 只看该作者

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



使用特权

评论回复
8
wakayi|  楼主 | 2019-7-6 16:55 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

4083

帖子

1

粉丝