Мастер Arduino I2C Wire доступен для чтения -1 255, если ведомый отправляет меньше байтов

я попробовал этот пример: http://arduino.cc/en/Reference/WireRead

Но если я отправлю менее 6 байтов от подчиненного устройства, мастер все равно попытается прочитать все 6 байтов, а затем функция чтения выдаст -1/255. Так что на самом деле доступная функция в этом случае бесполезна, я мог бы использовать до 6.

Любая идея, что я делаю неправильно или как я могу решить эту проблему? Я не могу просто отфильтровать все 255 значений, потому что иногда я их отправляю. Я просто не понимаю поведение библиотеки здесь.

Изменить: странно, что функция чтения возвращает целое число, а не байт. Так что я вижу, это -1 или 255. И это определенно 255 вместо -1. Если я попытаюсь прочитать 7 раз вместо использования доступной функции, последнее чтение будет -1. Ведомый отправляет неправильные байты или мне может понадобиться подтяжка или что здесь происходит?

Мое решение состоит в том, чтобы читать до тех пор, пока чтение не станет -1, вместо использования доступной функции. Но должно быть другое решение.


person Community    schedule 01.05.2014    source источник


Ответы (1)


Хотя это кажется неуместным, это ожидаемое поведение. Протокол I2C не предоставляет ведомому устройству никаких средств для завершения запрошенной передачи. Длина определяется исключительно параметром quantity, заданным для Wire.requestFrom. Таким образом, мастер решает и должен знать, сколько байтов отправит ведомый. Wire.available сигнализирует только о достижении заданной ранее длины.

Чтобы обеспечить сообщения переменной длины, вы можете выбрать символ-разделитель, например \0 для строковых передач, или добавить к сообщению байт, сохраняющий количество следующих байтов, и прекратить чтение, если указанная сумма будет достигнута.

person dronus    schedule 28.03.2015