两个假定相同的变量以某种方式具有不同的值

问题描述

我正在用STM32微控制器测试I2C协议。我做了一个函数,应该读取微控制器将要与之通信的从设备中寄存器的16位内容。我的问题不是围绕硬件,而是两个变量(一个函数返回,另一个函数通过指针参数修改)。

功能如下:

uint16_t __SimpleReadRegister(uint8_t cRegAddress,uint16_t *pRxBuff)
{
    /* Transmit the register address to read from to the IC - register address is 1 byte */
    HAL_I2C_Master_Transmit(&hi2c1,SLAVEDEVICE_ADDRESS,&cRegAddress,1,i2cTimeout);
    
    uint8_t tempRxBuff[2];
    uint8_t retval;
    
    /* Receive 2 bytes (contents of cRegAddress register from the IC */
    HAL_I2C_Master_Receive(&hi2c1,(uint8_t*)tempRxBuff,2,i2cTimeout);
    
    retval = (tempRxBuff[1] << 8) | tempRxBuff[0];            // BREAKPOINT 1 PLACED HERE
    *pRxBuff = (tempRxBuff[1] << 8) | tempRxBuff[0];          // BREAKPOINT 2 PLACED HERE
    
    return retval;
}

这是主要功能的一部分:

uint16_t status1 = 0x0000;
uint16_t status2 = 0xFFFF;
status2 = __SimpleReadRegister(0x00,&status1);
printf("0x%04X,0x%04X\n\n",(unsigned int)(status1 & 0xFFFF),(unsigned int)(status2 & 0xFFFF));

这里打印出的是: status1 = 0x0319,status2 = 0x0019
即使我认为它们应该是相同的值。 status1基本上是作为指针传递给函数的,该函数是在为status2赋值之后分配的。在BREAKPOINT1:tempRxBuff[0] = 0x19tempRxBuff[1] = 0x03,这意味着status2的值错误

status1在此处保持错误值的原因可能是什么?我还尝试过在HAL_I2C_Master_Receive()之后放置延迟,但并没有改变结果。

谢谢!

解决方法

您已在函数中将retval声明为uint8_t。当您对retval进行分配时,最高有效字节被屏蔽掉,仅留下最低有效字节。然后仅返回最低有效字节。

将retval更改为uint16_t。

,

retval的长度为8位,并且仅保留tempRxBuff[0]

*pRxBuff长16位,它将保存tempRxBuff[1] << 8) | tempRxBuff[0];的值

如果 tempRxBuff[1] == tempRxBuff[0]

,它们可以相同