【问题标题】:Sending 0x00 using I2C使用 I2C 发送 0x00
【发布时间】:2013-03-31 04:56:30
【问题描述】:

我正在使用 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。

【问题讨论】:

  • 您能显示您用于传输的代码吗,TX 和 RX 都可以?
  • I2C 能够在总线上传输任意字节,只要正确生成地址字节和停止/停止序列。您可以发布两个 Arduino 的代码吗?
  • I²C 绝对可以传输 0x00。如果不能,那是实现问题,而不是协议缺陷。

标签: c++ arduino i2c


【解决方案1】:

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

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

【讨论】:

  • @jedwards:如果你通过了大小,那么是的。但是没有它,就没有write() 的版本,它接受一个数字数组......此外,它怎么知道数组的大小?除非你想让它把bytes[4] 当作long,但我认为这是不可取的。
【解决方案2】:

在调用 Wire.write() 之前,是否发生了 Wire.begin() 和 Wire.beginTransmission()(地址正确)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2017-05-11
    • 1970-01-01
    • 2021-05-14
    • 2017-08-26
    相关资源
    最近更新 更多