AlekseyV писал(а):Размышляю над способом реализации общения между устройствами, соединенными между собой по RS-485 - как согласовать временные интервалы отправки пакетов?
Как правило, по технологии RS-485 строят сети, в которых есть одно ведущее устройство (master) и несколько ведомых (slave), и обмен выглядит так - master послал запрос конкретному slave, обращаясь к нему по уникальному адресу. Этот запрос получают все slave сети, но отвечает только тот, чей адрес совпадет с адресом, указанным в пакете запроса. Только при такой реализации сети не встает проблема арбитража.
На физическом уровне в сетях RS-485 арбитраж не реализован вообще, поэтому при наличии в сети нескольких master'ов (устройств, могущих инициировать обмен данными) проблему арбитража придется решать средствами протокола. На аппаратном уровне при этом передающему master'у придется "слушать сеть", то есть, принимать свой собственный пакет и сравнивать его с тем, что передавалось. Если пакет принялся с искажениями, значит, имела место коллизия - одновременная передача в сеть несколькими устройствами. В этом случае, например, устройство должно прекратить передачу и начать её снова после временнОго интервала случайной длительности.
В общем, все это сложно для новичка, поэтому лучше строить сеть с одним master'ом и несколькими slave'ми.
AlekseyV писал(а):К примеру, кол-во подключаемых устройств периодически меняется, сегодня 5 устройств, завтра 30.
В этом случае master последовательным опросом всех возможных адресов должен определить наличие устройств в сети. Ввести в протокол обмена короткую команду инициализации или что-то в этом роде, которую посылает master, и на которую slave должен дать короткий ответ.
Master создает в своей памяти таблицу занятых адресов из всего адресного пространства, можно тут же указать идентификаторы устройств, если они есть. И периодически проверять "свободные" адреса на предмет появления новых устройств с такими адресами.
Или можно сделать так, чтобы после подключения или отключения новых устройств давать master'у команду на обновление таблицы адресов.
AlekseyV писал(а):Мастер отправил пакет (бродкаст) и чтобы все одновременно не начали отправлять обратный ответ, а поочередно.
Бродкастовыми пакетами лучше делать те, на которые не нужно отвечать. Например, команда установки времени. Её можно сделать бродкастовой, ответ на неё не требуется. Или какая-нибудь команда начала измерения.
А для подтверждения того, что ведомые приняли команду, можно после посылки бродкастовой команды последовательно опросить всех ведомых и проверить, выполняют ли они полученную команду.
Вообще, в такой сети лучше не злоупотреблять бродкастовыми командами. Только необходимый минимум. А самое лучшее - вообще обойтись без них.
Как-то так. Найдите описание протокола ModBus, он как раз и реализует такую логику обмена. Никто не мешает также "допилить" этот протокол под свои требования.