Я использую класс Wire, чтобы два Undu Arduino общались с помощью 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.
Вы передаете массив char
с Wire.write()
… Это делает Wire
рассматривать аргумент как строку с нулевым символом в конце, и поэтому NULL
байт прекращает передачу. Если вы хотите отправить byte
s, позвоните write()
функция один раз для каждого байта, передавая его byte
типы.
Кроме того, вы можете позвонить write(const uint8_t *, size_t);
версия: вы передаете ему указатель на / массив байтов, но вы также должны указать размер массива данных.
Есть ли у вас Wire.begin () и Wire.beginTransmission () (с правильным адресом) перед вызовом Wire.write ()?