我正在使用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。
答案 0 :(得分:6)
您正在将char
的数组传递给Wire.write()
...这使得Wire
将参数视为以空字符结尾的字符串,因此将NULL
字节视为终止传输。如果您要发送byte
,请为每个字节调用write()
函数一次,并将其传递给byte
类型。
或者,您可以调用write(const uint8_t *, size_t);
版本:向它传递指向/数组字节的指针,但您还必须为其指定数据数组的大小。
答案 1 :(得分:0)
在调用Wire.write()之前,您是否有Wire.begin()和Wire.beginTransmission()(具有正确的地址)?