Цитата
Предполагается, что при включении мастер будет запрашивать по очереди все устройства для получения из заводских номеров и еще кое-какой информации. Когда произойдет обращение к устройствам с одним идентификаторам, они начнут передачу одновременно, коллизия произойдет при передаче данных. Вопрос в том, может ли контроллер одного из них узнать об этом? Ведь арбитраж происходит только по ИД? Если бы устройство могло узнать об ошибке, оно бы инкрементировало "суб-идентификатор" (например два младших бита идентификатора). После окончания ответа первого устройства оно выдает свой ответ, но уже со своим идентификатором и мастер узнает о наличии двух устройств.
Таким образом, вопрос лишь в том, может ли устройство узнать о том, что при передаче произошла коллизия в поле данных? До сих пор с CAN-ом иметь дела не приходилось, не знаю его тонкостей.
Все намного проще. Мастер может послать одну команду всем узлам - выдайте свои идентификационные данные. Каждый узел после случайной задержки выдает сообщение со своими данными. Это сообщение может иметь даже одинаковый идентификатор для всех - в случае коллизии узлы узнают, что она произошла и повторят передачу через случайные интервалы времени. Проблем тут не будет.
А конце концов мастер получит информацию о всех узлах, присутвующих в сети. И затем может сказать - мол ты, такой-то узел, с таким серийным номером - получаешь идентификатор 0x15A, а ты - 0x25B и т.д. Это кстати в протоколах высокого уровня типа CANopen реализовано уже.