I2C master/slave максимальный размер сообщения requestEvent

При использовании главного устройства NodeMCU и подчиненного устройства Arduino (Wire.h с обеих сторон), существует ли максимальный размер сообщения (32 байта? ?) для ответа, который ведомое устройство отправляет из requestEvent()?

Если да, то есть ли решение обойти такое ограничение БЕЗ использования других библиотек (например, I2C_Anything)?

, 👍0

Обсуждение

Какие библиотеки вы используете с обеих сторон? Провод на ардуино? А какая библиотека на NodeMCU?, @chrisl


1 ответ


Лучший ответ:

1

Сам протокол I2C не имеет ограничения на размер передачи. Но реализация в библиотеке Wire резервирует только определенный объем оперативной памяти для буферов. На этом сайте упоминается 32 байта для обычных Arduino (в настоящее время не удалось найти исходный код), и я нашел 128 байтов для ESP8266 в исходном коде.

У вас не может быть неограниченной длины сообщения, так как буфер должен содержать все сообщение, а объем оперативной памяти на обычных Arduino очень ограничен.

Но вы можете увеличить буферы библиотек, изменив соответствующие определения в файлах заголовков на большее значение. Имейте в виду, что фактическое используемое пространство памяти имеет коэффициент 2, поскольку размер буфера используется как для буфера отправки, так и для буфера приема.


Если вам нужны сообщения большего размера, чем помещается в доступной оперативной памяти, вам следует либо перейти на плату с большей оперативной памятью, либо разработать способ обработки одной части сообщения, удаляя ее, а затем обрабатывая следующую часть (несколько часть сообщения). Хотя возникает вопрос, почему сообщения должны быть такими большими.

,

Я протестировал и довел его до предела, не возясь с библиотекой Wire.h, и это не сработало., @tony gil

Что именно вы тестировали, как и что именно не сработало?, @chrisl

я увеличил массив символов до 64 вместо 32 байтов. Мастер не получил сообщение. Изменено обратно на 32 байта, и он снова начинает получать., @tony gil

https://github.com/arduino/ArduinoCore-avr/blob/7a2e1cd815266fef3012a5c9b48f88d78551f838/libraries/Wire/src/Wire.h#L1, @Juraj

судя по всему, да, с библиотекой Wire.h нужно повозиться, что сделает реализацию скетча нестандартной. Нет никакой гарантии, что будущие версии этой библиотеки примут такие изменения., @tony gil

Конечно, гарантии никогда нет. Но очень вероятно, что будущая реализация все же позволит это сделать, так как не существует разумного способа обойти фиксированный размер буфера (динамическое выделение плохо для микроконтроллеров). И у них уже есть одно определение для этого, поэтому маловероятно, что они изменят его на менее хороший способ установки размера буфера., @chrisl