Передача массива между 2 Arduino (Serial или I2C)

Cancer_litus

✩✩✩✩✩✩✩
27 Июл 2023
5
0
Здравствуйте подскажите пожалуйста оптимальный способ передачи массива с Pro micro на UNO
Я хочу понять достоинства и недостатки I2C и Serial

К сожалению не могу понять чем тот или иной способ лучше
А также интересует вариант решения) (пример программы для передачи и приема массива))))))))
 

vortigont

★★★★★★✩
24 Апр 2020
1,021
542
Saint-Petersburg, Russia
с точки зрения передачи/приема массива вообще без разницы по какой шине их передавать - когда вы едите свежедоставленную пиццу вам же не важно на каком самокате вам её курьер привёз, правда? :)
Примеров в интернете навалом, спросите у чатГПТ если уж с гуглением совсем туго.
 
  • Лойс +1
Реакции: Cancer_litus

Старик Похабыч

★★★★★★★
14 Авг 2019
4,280
1,304
Москва
Повторюсь здесь.
Важно:
1) Расстояние между МК
2) Требуемая скорость передачи данных (чем быстрее тем лучше не подходит, надо реальную необходимость) . А скорость у нас расстояние делить на время. Тут в виде расстояния будет размер массива и время за которое его надо передать.
 

Cancer_litus

✩✩✩✩✩✩✩
27 Июл 2023
5
0
понял принял спасибо большое
Расстояние небольшое 50-125мм

@vortigont,
а есть ли похожий подробный пример для i2c?))
 

Cancer_litus

✩✩✩✩✩✩✩
27 Июл 2023
5
0
проблема в том что в этой библиотеке нет работ с массивами
с отдельными значениями работал просто мне кажется что отправлять массив целиком и потом с ним работать правильнее чем разбивать на значения и их отправлять @Старик Похабыч,

и так добрый вечер
у меня получилось вот так
но мне кажется это шляпа какая-то но работает подскажите пожалуйста как это улучшить
вот код приемника

Приемник:
#include <SoftwareSerial.h>

const size_t dataLength = 5;
int data[dataLength];
 
SoftwareSerial mySerial(10, 11);

void setup() {
  Serial.begin(115200);
  mySerial.begin(9600);
}
void loop() {
  if(mySerial.available() >= dataLength * sizeof(data[0]))
   {
    mySerial.readBytes((byte*)data, dataLength * sizeof(data[0]));
    }
    
  Serial.println(data[1]);
}
а вот передатчик (работаю с pro micro за пины не судите но если надо другие использовать скажите)
Передатчик:
#include <SoftwareSerial.h>

const size_t dataLength = 5;
int data[dataLength] = {10, 11, 12, 13, 14};

SoftwareSerial mySerial(10, 14);

void setup() {
  Serial.begin(115200);
  mySerial.begin(9600);
}
void loop() {
  mySerial.write((byte*)data, dataLength * sizeof(data[0]));
  delay(0);
}
но вот с i2c я завис
подскажите пожалуйста
 

Вложения

poty

★★★★★★✩
19 Фев 2020
3,286
952
dataLength * sizeof(data[0]) вполне себе заменяется на sizeof(data)
Код рабочий, но учебный по сути, поскольку любой сбой на линии или пропуск любого количества бит (из-за разного времени включения приёмника и передатчика, допустим) рассинхронизирует передачу. Нужно придумать хотя бы уникальную "стартовую последовательность" и "стоповую последовательность" (в которой зашить также любой проверочный коэффициент, типа CRC) и начинать приём только после получения корректной стартовой последовательности, а в конце приёма - проверить по проверочному коэффициенту правильность передачи.
 
  • Лойс +1
Реакции: Старик Похабыч

Cancer_litus

✩✩✩✩✩✩✩
27 Июл 2023
5
0
да
слишком учебный
больше 3 значений слетает(

нашел другой способ