Отправка 0x00 с использованием I2C

Я использую класс 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.

0

Решение

Вы передаете массив charс Wire.write()… Это делает Wire рассматривать аргумент как строку с нулевым символом в конце, и поэтому NULL байт прекращает передачу. Если вы хотите отправить bytes, позвоните write() функция один раз для каждого байта, передавая его byte типы.

Кроме того, вы можете позвонить write(const uint8_t *, size_t); версия: вы передаете ему указатель на / массив байтов, но вы также должны указать размер массива данных.

6

Другие решения

Есть ли у вас Wire.begin () и Wire.beginTransmission () (с правильным адресом) перед вызовом Wire.write ()?

0

По вопросам рекламы [email protected]