I2C master/slave максимальный размер сообщения requestEvent
При использовании главного устройства NodeMCU
и подчиненного устройства Arduino
(Wire.h
с обеих сторон), существует ли максимальный размер сообщения (32 байта? ?) для ответа, который ведомое устройство отправляет из requestEvent()
?
Если да, то есть ли решение обойти такое ограничение БЕЗ использования других библиотек (например, I2C_Anything
)?
@tony gil, 👍0
Обсуждение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
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Как перевести Arduino Nano в спящий режим с низким энергопотреблением (<0,05 мА)
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- MAX30100 не работает
- Библиотека I2C MIFARE RC522
- Использовать NodeMCU 12E (ESP8266) в качестве экрана Wi-Fi для Arduino Nano
- Не удалось выделить SSD1306 при добавлении константы
Какие библиотеки вы используете с обеих сторон? Провод на ардуино? А какая библиотека на NodeMCU?, @chrisl