如何解决为什么 Wire.write() 的参数是类型转换的?
当我看到为通过 I2C 与外部 EEPROM 和 RTC 等通信而编写的代码时,我总是注意到当使用 Write.write()
发送寄存器地址字节和数据字节时,十六进制地址被类型转换为 { {1}} 或 byte
如下所示:
int
函数就是这样调用的
static uint8_t read_i2c_register(uint8_t addr,uint8_t reg) {
Wire.beginTransmission(addr);
Wire.write((byte)reg);
Wire.endTransmission();
Wire.requestFrom(addr,(byte)1);
return Wire.read();
}
为什么寄存器的十六进制地址在方法
#define ADDR 0x01
#define REG 0x20
read_i2c_register (ADDR,REG);
中进行了类型转换,而在方法 Wire.write()
中没有进行类型转换。这让我非常困惑,因为这两种方法都将一个字节作为参数。
解决方法
因为 requestFrom
方法被重载了。有一个 requestFrom(int,int)
,取两个整数,一个 requestFrom(uint8_t,uint8_t)
取两个字节。
上述调用 Wire.requestFrom(addr,1)
不完全匹配它们中的任何一个,因为参数是 uint8_t
和 int
。并且不允许编译器偏袒另一个。
因此,通过添加 (byte)
强制转换,第二个参数被强制为 uint8_t
,从而消除了歧义。要在所有情况下都完全正确,该转换应该是 (uint8_t)
。
write
调用中的强制转换不是必需的并且什么都不做,因为 reg
已经是一个 uint8_t(这是一个字节)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。