为什么 Wire.write () 的参数是类型转换的?
Why is the argument for Wire.write () type-casted?
当我看到为通过 I2C 与外部 EEPROM 和 RTC 等进行通信而编写的代码时,我总是注意到在使用 Write.write()
发送寄存器地址字节和数据字节时,十六进制地址被类型转换为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()
中进行了类型转换,而在方法Wire.beginTransmission()
中没有进行类型转换。这让我非常困惑,因为这两种方法都将单个字节作为参数。
因为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(一个字节)
当我看到为通过 I2C 与外部 EEPROM 和 RTC 等进行通信而编写的代码时,我总是注意到在使用 Write.write()
发送寄存器地址字节和数据字节时,十六进制地址被类型转换为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()
中进行了类型转换,而在方法Wire.beginTransmission()
中没有进行类型转换。这让我非常困惑,因为这两种方法都将单个字节作为参数。
因为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(一个字节)