cbone
@cbone
Серверная инфраструктура

/bin/sh и RS-485: как правильно отправлять на /dev/ttyS1 9 байт?

Данный вопрос является продолжением этого.
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

ничего не получаю в ответ.
  • Вопрос задан
  • 4521 просмотр
Пригласить эксперта
Ответы на вопрос 4
dlinyj
@dlinyj
Может лучше и проще всё реализовать на Си?
Ответ написан
ProstoTyoma
@ProstoTyoma
Вероятно, надо как-то настроить параметры передачи: бодрейт, старт\стоп биты, биты данных. Как это сделать в линуксе, к сожалению, не скажу.
Ответ написан
@northbear
echo -en обязательно. Без -n в конец строки будет добавлен newline…
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы