先读取和存储 MSB
Reading and Storing MSB first
我被认为是编程的初学者,很抱歉,如果这是一个非常简单的问题。
我正在使用 STM32f411 uC 通过 I2C 协议读取压力传感器 MS5525DSO。通过Eclipse使用c语言编程
当我从传感器 "PROM" 内存中读取数据时,我期望 2 个字节 "clocked with the MSB first" 作为第 10 页中所述的数据 sheet。
我的代码:
uint8_t Cmd= 0xA6;
// Transmit a request to read from 0xA6 memory address:
HAL_I2C_Master_Transmit(&I2C_HandleTypeDef, sensor_address, Cmd, 1 byte, timeout);
uint8_t PROM [2];
// Read from PROM 0xA6
HAL_I2C_Master_Receive(&I2C_HandleTypeDef, sensor_address, &PROM[0], 2 bytes, timeout);
现在,我将这两个字节存储在一个数组变量中 unint8_t PROM [2]
,
结果是:
PROM [0]= 61 十进制或 (0011 1101 b)
PROM [1]= 66 十进制或 (0100 0010 b)
使用 memcpy
函数,则值应为 = 15,682 或 (0011 1101 0100 0010 b)
然后,我改变主意,说让我把数据直接存储在一个16位变量中,所以,
unint8_t PROM
--->> unint16_t PROM
当我执行时,我得到了这个值:
PROM = 16,957 十进制或 (0100 0010 0011 1101 b)
很明显是先写第二个字节(66d)再写后面的(61d)字节,
所以,我很困惑。我的第一种方法是正确的还是我遗漏了什么?第二种方法是否交换字节?哪一个是正确的?
你可以用 (x1 << 8) | x2
将两个 8 位存储到一个 16 位中,其中 x1
是 PROM[0]
而 x2
是 PROM[1]
这是在 ,<<
和|
是逻辑运算符,<<
是左移,|
是或
还有很多其他的位破解方案,cf https://graphics.stanford.edu/~seander/bithacks.html
感谢大家的评论和回答。
正如您所说,这是一个字节序问题。因此,我将这一行添加到代码中,给出 "PROM" 是一个 16 位 uint。
PROM= ((PROM<<8)&0xff00)|((PROM>>8)&0x00ff);
这将进行字节交换。
幸运的是,我的传感器具有温度测量功能。所以,我可以验证我的代码并使用上面的字节交换行代码得到正确的结果“23 C”(我的房间温度)。
但是,我仍然对为什么我的代码中使用的函数执行小端排序感兴趣,并且有没有办法更改该设置。
再次感谢您的贡献。
我被认为是编程的初学者,很抱歉,如果这是一个非常简单的问题。
我正在使用 STM32f411 uC 通过 I2C 协议读取压力传感器 MS5525DSO。通过Eclipse使用c语言编程
当我从传感器 "PROM" 内存中读取数据时,我期望 2 个字节 "clocked with the MSB first" 作为第 10 页中所述的数据 sheet。
我的代码:
uint8_t Cmd= 0xA6;
// Transmit a request to read from 0xA6 memory address:
HAL_I2C_Master_Transmit(&I2C_HandleTypeDef, sensor_address, Cmd, 1 byte, timeout);
uint8_t PROM [2];
// Read from PROM 0xA6
HAL_I2C_Master_Receive(&I2C_HandleTypeDef, sensor_address, &PROM[0], 2 bytes, timeout);
现在,我将这两个字节存储在一个数组变量中 unint8_t PROM [2]
,
结果是:
PROM [0]= 61 十进制或 (0011 1101 b)
PROM [1]= 66 十进制或 (0100 0010 b)
使用 memcpy
函数,则值应为 = 15,682 或 (0011 1101 0100 0010 b)
然后,我改变主意,说让我把数据直接存储在一个16位变量中,所以,
unint8_t PROM
--->> unint16_t PROM
当我执行时,我得到了这个值:
PROM = 16,957 十进制或 (0100 0010 0011 1101 b)
很明显是先写第二个字节(66d)再写后面的(61d)字节,
所以,我很困惑。我的第一种方法是正确的还是我遗漏了什么?第二种方法是否交换字节?哪一个是正确的?
你可以用 (x1 << 8) | x2
将两个 8 位存储到一个 16 位中,其中 x1
是 PROM[0]
而 x2
是 PROM[1]
这是在<<
和|
是逻辑运算符,<<
是左移,|
是或
还有很多其他的位破解方案,cf https://graphics.stanford.edu/~seander/bithacks.html
感谢大家的评论和回答。
正如您所说,这是一个字节序问题。因此,我将这一行添加到代码中,给出 "PROM" 是一个 16 位 uint。
PROM= ((PROM<<8)&0xff00)|((PROM>>8)&0x00ff);
这将进行字节交换。
幸运的是,我的传感器具有温度测量功能。所以,我可以验证我的代码并使用上面的字节交换行代码得到正确的结果“23 C”(我的房间温度)。
但是,我仍然对为什么我的代码中使用的函数执行小端排序感兴趣,并且有没有办法更改该设置。
再次感谢您的贡献。