Какой тип данных лучше всего использовать через i2C

Я пытаюсь отправить несколько команд нескольким ведомым устройствам, управляющим двигателями. Ведомый контроллер (Arduino Nano) получит команду и вернет текущее положение двигателей ведущему (Arduino Mega).

Какой тип данных лучше всего использовать в этом сценарии. Я рассматриваю строковый или байтовый тип данных.

, 👍0

Обсуждение

Почему вы рассматриваете строку? Будет ли это читаться людьми? Я не слышал об интерфейсах I2C для человека. - Представьте, что существует формат файла изображения, основанный на XML. Как вы думаете, это будет эффективно?, @Kwasmich

I2C обычно представляет собой однобайтовый адрес регистра и от одного до четырех байтов двоичных данных (интерпретируемых устройством I2C как битовая строка от 8 до 32 бит). Интерфейс разработан как высокоскоростная, малообъемная, недорогая система управления и контроля (ведущий-ведомый). Вы должны прочитать подробности на https://i2c.info/i2c-bus-specification., @Dougie

я планирую использовать строку, чтобы сделать команду уникальной. но я понимаю вашу точку зрения, спасибо, что указали на это., @Julius Noel Banayo

Строка как массив символов имеет смысл. Использование C++ String **не** имеет смысла. Однако я бы предложил использовать массивы символов фиксированной длины без нулевых терминаторов по сравнению со строками C с нулевым завершением. Это может облегчить чтение ваших команд. Вы также можете использовать целочисленные значения перечисления. Это, вероятно, уменьшит количество байтов, но сделает данные более трудными для чтения, если вы выведете их на консоль., @Duncan C


2 ответа


2

I2C работает с байтовыми массивами фиксированного размера.

Одних байтов для команд должно быть достаточно. Для позиций вам может понадобиться int16_t или даже больше. Позиции без знака относительно (выше) нуля могут в конечном итоге упростить задачу (?)

Поскольку обе стороны имеют одинаковую архитектуру, сопоставление массивов байтов с большими числами с помощью union будет работать хорошо.

,

...или, если обе стороны используют один и тот же «протокол», вы можете использовать hton* и ntoh*, чтобы сделать свой код независимым от архитектуры., @ipmcc


1

Строки (они же массивы байтов произвольной длины) идеально подходят для асинхронных и полнодуплексных протоколов, таких как UART, главным образом потому, что они не являются протоколами ведущий-ведомый. Здесь и ведущий, и подчиненный могут передавать поток байтов независимо друг от друга в любое время и любой длины.

Но использование строк в I2C довольно редко. Поскольку I2C представляет собой шину ведущий-ведомый, где любая связь (чтение и запись) инициируется ведущим, генерирующим часы шины, использование строк имеет большой недостаток, заключающийся в том, что ведущий должен знать количество байтов. подчиненный должен передать. Конечно, вы можете реализовать это, но пока вам не нужны данные, которые могут быть читаемы человеком, я предлагаю более эффективный способ передачи байтов. Обычно передача чтения i2c выполняется

  1. обращение к подчиненному устройству в режиме записи
  2. Запись адреса регистра целевого значения
  3. Адресация подчиненного устройства в режиме чтения
  4. Чтение произвольного количества байтов (например, четырех байтов для значений с плавающей запятой)

Передача записи немного проще:

  1. обращение к подчиненному устройству в режиме записи
  2. Запись адреса регистра целевого значения
  3. Запись произвольного количества байтов (например, четыре байта для значений с плавающей запятой)

Это стандартный протокол, который используют, например, датчики I2C, и удобно реализовать такое же поведение в ISR при использовании микроконтроллера (вы можете думать об «адресах регистров» как об «идентификаторах переменных»).

Чтобы подготовить значения любого типа данных для передачи (например, с плавающей запятой в байт[4]), вы можете использовать union.

,