OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5752|回复: 4

使用union进行字节,字,双字的拼接与拆分(有大小端限制)

[复制链接]

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
发表于 2015-7-10 10:02:03 | 显示全部楼层 |阅读模式
我使用的平台是小端模式:
声明这样一个联合体:
[mw_shl_code=c,true]typedef union { u32 dword; u16 word[2]; u8 byte[4]; }u32val;[/mw_shl_code]

[mw_shl_code=c,true]int main() { u8 volatile a,b,c,d; u16 volatile e,f; u32val volatile u32j,*u32p; u32 volatile g,h,i,j,k; u32p = &u32j; u32p->dword = 0x12345678; a = u32p->byte[0]; b = u32p->byte[1]; c = u32p->byte[2]; d = u32p->byte[3]; e = u32p->word[0]; f = u32p->word[1]; g = (u32)u32p; h = (u32)(u32p->byte); i = (u32)(u32p->word); j = (u32)&(u32p->byte[1]); k = (u32)&(u32p->word[1]); } [/mw_shl_code]


可以省去移位操作,来进行字节拼接成字。

比如:地址的拼接与拆分。
例如这样一个函数:
[mw_shl_code=c,true]typedef union { u32 DWord; u16 Word[2]; u8 Byte[4]; }UINT32_VAL; u32 SPIReadDWord(u16 Address) { UINT32_VAL dwResult; UINT16_VAL wAddr; wAddr.Word = Address; SPI_SEL_ENABLE; SPI2_ReadWriteByte(CMD_SERIAL_READ); SPI2_ReadWriteByte(wAddr.Byte[0]); SPI2_ReadWriteByte(wAddr.Byte[1]); dwResult.Byte[0] = SPI2_ReadWriteByte(0xff); dwResult.Byte[1] = SPI2_ReadWriteByte(0xff); dwResult.Byte[2] = SPI2_ReadWriteByte(0xff); dwResult.Byte[3] = SPI2_ReadWriteByte(0xff); SPI_SEL_DISABLE; return dwResult.DWord; } [/mw_shl_code]

好处不言而喻。但是缺点就是,注意处理器的大小端模式。
在你没有做出成绩之前,这个世界不会在乎你的自尊。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12224
金钱
12224
注册时间
2013-3-8
在线时间
1297 小时
发表于 2015-7-10 11:08:38 | 显示全部楼层
楼主说的对,我就一直用这种方式。串口接收与发送就方便很多。
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2015-7-10 11:35:54 | 显示全部楼层
楼主的经验分享真不错呢。赞一个!
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

4

主题

98

帖子

0

精华

高级会员

Rank: 4

积分
755
金钱
755
注册时间
2015-9-16
在线时间
94 小时
发表于 2016-3-7 17:28:22 | 显示全部楼层
今天刚好遇到类似问题,感谢分享。想想以前都是使用的移位方式,这下新技能Get了。
回复 支持 反对

使用道具 举报

3

主题

177

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1604
金钱
1604
注册时间
2016-1-28
在线时间
265 小时
发表于 2017-5-11 08:11:40 | 显示全部楼层

今天刚好遇到类似问题,感谢分享。想想以前都是使用的移位方式,这下新技能Get了。
宠辱不惊看庭前花开花落去留无意望天上云卷云舒。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-21 10:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表