打印
[STM32F4]

[学习笔记]STM32小端格式验证及结构体使用注意事项

[复制链接]
754|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
goodbaiy|  楼主 | 2018-12-30 21:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
参考手册显示STM32为小端格式,验证一下STM32的小端格式。
使用NUCLEO-F413ZH开发板,HAL生成相关代买。程序关键代码如下:
//定义共用体
         union{
                   uint16_t a;
                   uint8_t b;
         } endian;
//共用体赋值并输出结果
         endian.a = 1;
         HAL_UART_Transmit_IT(&huart2,&endian.b, 1);
如果输出为1则为小端格式,输出为0则是大端格式。


继续扩展一下,如果是使用两个类型组成的结构体呢?关键代码如下:
         //定义共用体
         union
         {
                   struct
                   {
                            uint8_ta;
                            uint16_tb;
                   }sttest;
                   uint8_tbyte[3];
         }untest;
         //数据初始化
         untest.byte[0] = 0;
         untest.byte[1] = 0;
         untest.byte[2] = 0;
         //untest.byte[3] = 0;
         //赋值
         untest.sttest.a = 1;
         untest.sttest.b = 2;
         //输出验证
         HAL_UART_Transmit_IT(&huart2,untest.byte, 3);
编译MDK不报错,下载后查看结果。
输出结果01 0002,按照小端格式,最后的untest.sttest.b应该是02 00才对,问题在哪?
让系统单独输出untest.sttest.a或者untest.sttest.b结果都是对的,后来百度下才知道原来结构体变量开辟空间时,使用占用空间最大的变量作为基准,即untest.sttest.a也开辟了两个字节,只不过一个字节空闲而已。调整程序如下:
         //定义共用体
         union
         {
                   struct
                   {
                            uint8_ta;
                            uint16_tb;
                   }sttest;
                   uint8_tbyte[4];
         }untest;
         //数据初始化
         untest.byte[0] = 0;
         untest.byte[1] = 0;
         untest.byte[2] = 0;
         untest.byte[3] = 0;
         //赋值
         untest.sttest.a = 1;
         untest.sttest.b = 2;
         //输出验证
         HAL_UART_Transmit_IT(&huart2,untest.byte, 4);
程序下载后串口查看结果正确。
如果数据不初始化,则结果亦不正确,因为多开辟的空间在给untest.sttest.a赋值时没有被使用。


以上是本人在实用中发现的问题,与大家分享,共同提高。


未初始化.png (20.81 KB )

未初始化.png
沙发
mmuuss586| | 2018-12-31 22:22 | 只看该作者
感谢楼主分享

使用特权

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

本版积分规则

13

主题

75

帖子

1

粉丝