使用I2C发送0x00

时间:2013-03-31 04:56:30

标签: 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);
}

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

结果为:1 2 255 255。

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

在调用Wire.write()之前,您是否有Wire.begin()和Wire.beginTransmission()(具有正确的地址)?