Данный вопрос является продолжением
этого.
1. Есть ПЛК с RS-485. На ПЛК крутится Линукс.
2. Есть БПИ тоже с RS-485. К БПИ подключен датчик температуры. БПИ по RS-485 способен передавать текущее значение температуры.
На БПИ реализован протокол обмена данными.
Привожу краткое описание протокола:
===========================================================
Формат кадра
длина кадра при приеме и передаче не изменяется и равна 9 байт
b0 -Es0 — Synchro 0 0xCA
b1 -Es1 — Synchro 1 0x35 прием(из компа к девайсу) / 0x53 передача(от девайса к компу)
b2 -Ed0 — байт 0 блока данных
b3 -Ed1 — байт 1 блока данных
b4 -Ed2 — байт 2 блока данных
b5 -Ed3 — байт 3 блока данных
b6 -Eid — идентификатор девайса
b7 -Ecm — Комадна/ответ
b8 -Eid — CRC Дополнение КС до 0
===========================================================
Скорость передачи данных 19200 байт/сек.
стоповые биты — 2
паритет — нет.
Идентификатор девайса ID: 1-255 //Задаётся в БПИ, в нашем случае = 1
Биты кода ответа (Ecm)
Rerr 7 // Наличие ошибки err+cdr+nop
Rcdr 6 // Ошибка кадра cdr
Rcrc 5 // Ошибка CRC
Rnop 4 // Ошибка (нет указанной команды) nop
Rrnq 3 // Указанный адрес выходит из диапазона допустимых адресов
Rrdy 2 //
Rack 1 // Команда выполнена
Rbsy 0 // Невозможно выполнить команду, прибор занят
1. Если Slave принимает корректный запрос и может его нормально обработать, то возвращает нормальный ответ.
2. Если Slave не принимает какого либо значения, никакого ответа не отправляется. Master диагностирует ошибку по таймауту.
3. Если Slave принимает запрос, но обнаруживает ошибку (ID), никакого ответа не отправляется. Master диагностирует ошибку по таймауту.
4. Если Slave принимает запрос, но не может его обработать (указана не существующаяя команда и т.д.), отправляется ответ содержащий в себе данные об ошибке.
================================================
Чтобы получить значение температуры необходимо отправить запрос БПИшнику:
CA 35 00 00 00 00 01 0C F4
В описании протокола написано, что должен вернуться ответ в виде:
ca 53 ww ww ww ww ID Ecm CRC
, где
ww ww ww ww
— значение температуры hex-float
Не пойму как правильно отправить данные 9 байт запроса на
/dev/ttyS1
?
Пробовал так:
echo "\xCA\x35\x00\x00\x00\x00\x01\x0C\xF4" > /dev/ttyS1
ничего не получаю в ответ.