为什么 Wire.write () 的参数是类型转换的?

Why is the argument for Wire.write () type-casted?

当我看到为通过 I2C 与外部 EEPROM 和 RTC 等进行通信而编写的代码时,我总是注意到在使用 Write.write() 发送寄存器地址字节和数据字节时,十六进制地址被类型转换为byteint 如下所示:


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_tint。并且不允许编译器偏袒另一个。

因此,通过添加 (byte) 转换,第二个参数被强制为 uint8_t,从而消除了歧义。该演员表应该 (uint8_t) 在所有情况下都完全正确。

不需要在 write 调用中进行强制转换,因为 reg 已经是一个 uint8_t(一个字节)