使用I2C发送0x00

zam*_*664 0 c++ arduino i2c

我使用Wire类让两个Arduino Unos使用I2C进行通信.似乎Wire类以0的值结束传输.因此,如果我发送字节0x01,0x02,0x00和0x04,则主机接收:0x01,0x02,0xFF,0xFF.

设计用于处理器通信的通信网络不能发送0x00似乎很奇怪.我见过的所有I2C示例都只使用ASCII.限制为ASCII的处理器间通信似乎没有任何意义.我错过了I2C的东西,还是仅仅是Arduino Wire类的实现限制?

void loop() {
  Wire.requestFrom(2, 4); 

  while(Wire.available()) { 
    byte b = (byte) Wire.read(); 
    Serial.println(b); 
  }

  delay(1000);
}
Run Code Online (Sandbox Code Playgroud)

奴隶

void requestEvent() {
  char bytes[4] = {0x01,0x02,0x00,0x04};
  Wire.write(bytes);
}
Run Code Online (Sandbox Code Playgroud)

结果是:1 2 255 255.

当0x00是0x03时,我得到了预期:1 2 3 4.

ang*_*rge 6

您正在将一个chars 数组传递给Wire.write()...这使得Wire将参数视为以null结尾的字符串,因此该NULL字节终止传输.如果要发送bytes,请write()为每个字节调用一次函数,并传递它byte类型.

或者,您可以调用该write(const uint8_t *, size_t);版本:向它传递指向/数组字节的指针,但您还必须为其指定数据数组的大小.