打印
[AVR单片机]

求助:4个字节合并为一个unsigned long型的方法

[复制链接]
2931|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
把数组acc_data_start_EEPROM中的四个字节拼成一个unsigned_long型,示意性程序如下,是这样操作的码?
我用ICCAVR编,烧到M8里,没有得到想要的数:54328855,哪里错了?求助。多谢。


unsigned long acc_data_start;
unsigned char acc_data_start_EEPROM={0x54,0x32,0x88,0x55};
acc_data_start=((acc_data_start_EEPROM[3]<<0x18)+(acc_data_start_EEPROM[2]<<0x10)+(acc_data_start_EEPROM[1]<<0x08)+(acc_data_start_EEPROM[0]));

相关帖子

沙发
-|continue;|-| | 2015-3-16 08:39 | 只看该作者
你想要的数应该是0x54328855,十进制应该是1412597845,如果都不对,可能是模式不对,试试
unsigned char acc_data_start_EEPROM【4】={0x54,0x32,0x88,0x55};
acc_data_start=((acc_data_start_EEPROM[0]<<0x18)+(acc_data_start_EEPROM[1]<<0x10)+(acc_data_start_EEPROM[2]<<0x08)+(acc_data_start_EEPROM[3]));

使用特权

评论回复
板凳
popeye021| | 2015-3-16 09:22 | 只看该作者
定义union数据啊


使用特权

评论回复
地板
NE5532| | 2015-3-16 20:38 | 只看该作者
别移位了,太慢了,如楼上,用共用体来组装吧。

使用特权

评论回复
5
sanguanko|  楼主 | 2015-3-19 00:36 | 只看该作者
移位也做出来了,多谢各位。我的想法是,先实现功能,自己会怎么做就怎么做,然后再优化

使用特权

评论回复
6
sanguanko|  楼主 | 2015-3-19 08:46 | 只看该作者
是,2个字节合并成unsigned int型成功,但是4个byte合并成unsigned long 型,高16位老是丢

使用特权

评论回复
7
s17701332| | 2015-3-20 16:59 | 只看该作者
可能是ICCAVR计算时把数据作为int型计算,当左移多余8位时数据丢失,加上强制转化字符(unsigned long)或者单步计算试试。

使用特权

评论回复
8
Adu0227| | 2015-3-20 17:18 | 只看该作者
需要加上强制类型转换

使用特权

评论回复
9
toofree| | 2015-3-23 22:56 | 只看该作者
给你个思路吧.

定义一个4字节的数组;
把你想要存的数从低字节到高字节,分别依次存入到数组元素0到3;
定义个字节类型指针,把数组的首地址给这个字节指针,然后把字节指针强制类型转换为 (unsigned long *)类型,然后取数就是你要的unsigned long型数了;

在51单片机时,常这么用。比如有时,要存个浮点数到E2PROM,就直接把浮点数用指针操作,强制转换为unsinged char型指针,然后分四次存入;要取数的时候,也是先取出来,然后用指针强制类型转换取数。

使用特权

评论回复
10
QuakeGod| | 2015-3-23 23:01 | 只看该作者
指针是C语言的精华。

使用特权

评论回复
11
toofree| | 2015-3-23 23:31 | 只看该作者
本帖最后由 toofree 于 2015-3-23 23:33 编辑



Win8 64位下Win-TC用不成了,只好用VC6下写了个测试程序,凑合看看

使用特权

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

本版积分规则

262

主题

290

帖子

2

粉丝