Выкладываю недоконченный вариант, про RS485. Примеры будут позже. Нет времени.
Code
Обмен данными между устройствами, или опять rs485.
Давно планировал написать про это, но о нем и так народом уже полно написано. Даже передумал, но возросший интерес на форуме же вдохновил взяться за эту тему снова.
Начнем:
Как и в usart в 485 в основном используется тот же протокол. Вариантов передачи данных здесь два: либо двоичный, либо Ascii. Все зависит от количества передачи данных на единицу времени. Чем длиннее линия данных тем скорость должна быть ниже. Стандартная скорость составляет 9600 или 4800. Теперь о протоколах. Вариантов масса. Самый распространенные это Modbus (умный дом) и DMX-512(управление световым
Двоичный протокол:
Данные передаются в двоичном формате в основном фиксированной длины. (В противном случае приходиться добавлять еще биты длины пакета). Первый байт это адрес слэйв устройства, далее следуют данные. Последние два байта это контрольная сумма для проверки принятых данных по стандарту crc16.
Устройство мастер подготавливает данные и вычисляет контрольную сумму. Отправив его в линию мастер ждет какое то время подтверждения приема от слэйв устройства которому оно предназначено.
Слэйв устройство накапливает принятые данные в буфере, после окончания приема сравнивает первый байт со своим внутренним адресом. Если они совпадают то этот пакет для него. В противном случае буфер приема очищается и слэйв ждет следующего пакета данных. После совпадения адреса из принятых данных высчитвается crc16 и сравнения с последними двумя байтами пакета. Если они не совпадают то слэйв формирует пакет мастеру об ошибке контрольной суммы, или игнорирует пакет очищая буфер приема. При совпадении контрольных сумм слэйв устройство выполняет необходимые операции и отсылает мастеру пакет подтверждения в котором содержится адрес слэйв устройства , данные и crc16.
Мастер находящийся в режиме ожидания ответа от слэйв устройства если в течении определенного времени не получает ответа сообщает оператору об отсутствии ответа от слэйва. При получении ответа от слэйва мастер так же сравнивает принятые в пакете адрес, данные и crc16. Если все совпадает, значит обмен пакетами произведен верно. В принимаемом пакете слэйв кроме ответа может отдавать данные для мастера ба куль будь то состояние входов, АЦП данные или другие параметры. Существует еще режим мульти мастер когда в линии могут находится несколько мастер устройств. Здесь гораздо сложнее так как приходится использовать арбитраж (очередь по которому мастера будут выходить в линию что бы не было проблем на линии)
Режим Ascii
Отличается от двоичной передачи скоростью и наглядность. Скорость при этом ниже, но если подключить в линию компьютер с переходником можно наглядно контролировать все процессы происходящие на линии. Здесь технология обмена между мастером и слэйвом точно такая же как и в предидущем протоколе, разница в том что здесь все данные идут в Ascii символами, есть символ начала посылки ($ или#) далее следуют от 1 до 3 символов адреса слэйв устройства. После этого идут данные. причем
Количество их ограничивается только размером буфера приема. Признаком конца передачи как правило сделать 2 бита. CR и FD. Десятичные коды их 10 и 13 соответственно. В приложениях к статье Вы найдете готовые примеры реализации обоих потоков: 485bin.dsn,485ascii.dsn, Схема для обоих программ одинаковая, разница только в программной части. Для удобства просмотра в пошаговом режиме вместо .hex загружен .cof. Оба устройства имеют жк индикатор и клавиатуру 4*4. Код каждой нажатой клавиши передается на индикатор второго устройства. Так же передаются данные с ацп.
Все замечания, предложения попрошу выкладывать на форум в соответствующий раздел.
Вроде все. Всем успехов.