Есть 2 арду соединенные через UART. Передатчик отдает команды в лупе вида: Код (Text): st=""; st1=""; String st="enc1,"+encoder1+",t"; String st1="enc2,"+encoder2+",s"; Serial.println(st); Serial.println(st1); Где encoder1,2 - показания оборотов с магнитного энкодера Приемник принимает строку и разбирает ее: Код (Text): int i:=0; char buffer[100]; if (mySerial.available()) { while( mySerial.available() && i< 5) { buffer[i++] = mySerial.read(); } //закрываем массив buffer[i++]='\0'; } if(i>0){ //разбираем его на части отделенные запятой sscanf(buffer, "%[^','],%[^','],%s", &unitID_in, &command_in, &data_in); Serial.println(unitID_in); Serial.println(command_in); Serial.println(data_in); Serial.print("\n"); unitID_in [0] = '\0'; command_in [0] = '\0'; } Но в итоге получается каша, все сьезжает, как правильно в относительном реалтайме передавать показания энкодера с одной арду на другую?
В код не вникал, но вижу, что буфер приема не кольцевой. Один байт пропустил и все поехало. Вот тут хороший пример приема-передачи пакетов данных между Ардуинами. Я на этом примере сделал первую сеть устройств через RS485, только добавил в пакет контрольный байт, все замечательно работает.
Если вы передаете всего пару байт, то зачем городить обмен на строках? Прилепите к двум байтам третий с контрольной суммой и задача упростится на порядок.
Можете чуть подробнее рассказать, пока не совсем понял смысл? могу упростить команду например до вида : e123s , где e- название датчика, 123- меняющиеся обороты, s-окончание. Как именно правильно передать эту команду? как правильно работать с контрольной суммой? как это выглядит? пока в этом опыта нет
Вот тут очень хороший пример пакетной передачи данных между Ардуинами. Правда без контрольной суммы, но добавить один байт в пакет не проблема. Пакет можно вообще любой длины и состава сделать, в зависимости от задачи.
Например: - первый байт - признак начала пакета - второй байт - номер датчика - третий байт - значение - четвертый байт - сумма второго и третьего с отбрасыванием переполнения. На приеме нужно всегда иметь 4 последних байта. Если первый равен признаку начала, а последний равен сумме второго и третьего, то пакет считается достоверно принятым и обрабатывается, а байты начинают копиться заново. Если контрольная сумма не сходится, то пакет не обрабатывается, а начинается ожидание стартового байта и накопление пакета.
Я двухуровневую систему на свой страх и риск делаю. Схема такая: один главный пинает по очереди ведомые первого уровня (по списку активных, реально 2-3 из 10). Ведомый приняв команду пинает ведомый второго уровня, их 0-2 штуки на каждый ведомый первого уровня. Тот отвечает первому, тот главному и так по кругу. Причем главный ждет пока все они заткнутся прежде чем отправить следующий запрос. Коллизий пока удается избегать. Пакет такой: Стартовый байт, адрес пинаемого, команда пинаемому (или ответ от пинаемого), кс из 2 и 3 пунктов, стоповый бит. Хотел добавить адрес отправителя, но решил что это излишне. За счет многоуровневости ответ о сработке на главный чаще всего приходит не сразу, а на следующий пинок, то есть через 50-200 мс, если это не смертельно, то вполне рабочая система получается. Пока что на шине висит главный, три первых, два вторых плюс общий для всех (рулит освещением, команды принимает от всех), на очереди еще гирлянда. Надеюсь, что все будет работать стабильно после увеличения "жильцов" до номинала. Первую версию подобной системы собирал не на шине, а на куче проводов устройство-устройство, застрелиться и не жить от такой паутины. Не сомневаюсь, что в этот раз я все делаю правильнее.
А зачем так сложно? Можно сделать шину или звезду с коммутаторами, всяко проще будет. Принцип, когда мастер по очереди опрашивает всех слэйвов - самый железобетонный вариант, люблю такие системы.
Некоторые слейвы состоят как бы из двух половин. То есть он вроде бы один, но разные датчики находится в разных комнатах. Сигнал же должен приниматься и передаваться как единому целому. Но все они висят на одной шине, то есть схематически все выглядит как одна гирлянда, а тактически как елочка. )
Можно парой слов подробнее? Преимуществ в описании я не нашел. Интерфейс RS-422 используется гораздо реже, чем RS-485 и, как правило, не для создания сети, а для соединения двух устройств на большом расстоянии (до 1200 м). Каждый передатчик RS-422 может быть нагружен на 10 приемников. Интерфейс работоспособен при напряжении общего вида до ±7 В.
Дуплекс не совсем мой вариант. Для двух устройств, наверное хорошо, но у меня их будет в районе 20, как начнут галдеть и разберись кто кому. Все равно придется устанавливать очередность и ждать пока одно выговорится прежде чем дать слово другому. К тому же скорость передачи данных не критична, да и пакеты смешные.
На каждый узел завести несколько аппаратных UART-ов и навесить функции роутера, а дальше все почти как в Ethernet, только RS422 в качестве транспорта и протоколы попроще.