如何解决两个假定相同的变量以某种方式具有不同的值
我正在用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] = 0x19
和tempRxBuff[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]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。