Здесь описан протокол взаимодействия с устройством управления постом автомойки.
Взаимодействие с устройством происходит посредством COM-порта по стандарту RS-232 Baudrate: 115200 Databits: 8 Stopbits: 1 Parity: None Mode: TX-RX
Все команды и ответы к ним представлены в виде 17-тисимвольных строк. Команды отправляются к исполнению сразу, как контроллер получает все 17 символов без нажатия кнопки [Enter
].
CMDARGUMENTARGARG
- строка в 17 символов длиной, где первые 3 символа - сама команда (CMD
). Остальные 14 символов (ARGUMENTARGARG
) - аргумент, и если он не требуется, вместо него указываются нули. Аргумент всегда представляется в виде беззнакового 16-тиричного числа. Невостребованные старшие разряды числа заполняются нулями.
После отправки команды всегда следует 17-тисимвольный ответ в таком же формате:
STS00000000000000
, где STS
обозначает Status, а 00000000000000
- дополнительная информация в 16-тиричном формате, где в случае её отсутствия проставляется 14 нулей, а невостребованные старшие разряды 16-тиричного числа, в случае наличия такового, так же будут заполнены недостающим количеством нулей
Контроллер также может отправлять пользователю некоторые сообщения, не являющиеся ответом на команду. Такие сообщения называются событиями. События не предусматривают ответ от пользователя, следовательно, отправлять какое-либо подтверждение получения события не требуется. События имеют синтаксис, схожий с синтаксисом команд: это такие же 17-тисимвольные последовательности, где первые 3 символа - название события, а последующие 14 символов - полезная нагрузка.
В случае отправки несуществующей команды, либо в случаях нарушения синтаксиса, вы получите в ответ "несуществующую команду". Это значение из 17-ти подряд идущих нолей (00000000000000000
)
Отправить команду длиной меньше чем 17 символов невозможно.
Если Вы получаете "несуществующую команду" на казалось бы валидную команду от Вас, отправьте в устройство символ @
. На отправку этого символа, Вы не получите никакого ответа. Воспринимайте это как очистку консоли. Как только устройство получит этот символ, оно автоматически очистит буфер ввода. Это должно решить проблему.
Почему вообще может возникать эта проблема? Всё дело в том, что пользователь может не уследить за своими действиями и отправить больше 17-ти символов за раз (причин достаточно). Для собственной безопасности, можете считать что каждая команда состоит из 18-ти символов (т.е.
@[CMD][ARGARGARGARGAR]
- просто с собакой в начале).
Пример: GYN00000000000000
Команда: GYN
Аргумент: Не требуется
Команда для запроса уникального имени устройства, полученного при прошивке устройства (Для идентификации постов). Уникальное имя устройства берётся из регистра самой микросхемы из значения, зашитого на заводе изготовителе, следовательно, у пользователя нет возможности изменить это значение.
Ответ
DUN00001F4487C4BF
- Device Unique Number со значением00001F4487C4BF
Пример: GCI00000000000000
Команда: GCI
Аргумент: Не требуется
Команда для запроса вставленной карты в считыватель устройства. UID представляет собой 4 байта, представленных в 16-тиричном виде.
Ответ
CID000000890F6ED1
- Card UID со значением000000890F6ED1
либоCID00000000000000
, если карта не вставлена
Пример: GRS00000000000000
Команда: GRS
Аргумент: Не требуется
Команда для запроса состояния включённых сейчас реле. В качестве ответа получает 16-тиричное число с маской включённых в настоящий момент реле. Маска читается справа налево.
Response Value | HEX | BIN | Value |
---|---|---|---|
00000000000001 |
0x1 |
0b001 |
Включено только 1-е реле, остальные выключены |
00000000000005 |
0x5 |
0b101 |
Включены 1-е и 3-е реле, остальные выключены |
00000000000011 |
0x11 |
0b1011 |
Включены 1-е, 2-е и 4-е реле, остальные выключены |
И так далее |
Ответ
RES00000000000007
- Relay Statuses, где00000000000007
и является Response Value, расшифровываемое по вышеописанной схеме.
Пример: TRE00000000000008
Команда: TRE
Аргумент: Значение двоичного логарифма в 16-тиричном формате
Команда для запроса на включение одного реле, его номер определяется по аргументу
Argument Value | HEX | BIN | Value |
---|---|---|---|
00000000000001 |
0x1 |
0b001 |
Включить 1-е реле |
00000000000004 |
0x4 |
0b100 |
Включить 3-е реле |
00000000000010 |
0x10 |
0b10000 |
Включить 5-е реле |
Команда может принимать в себя дизъюнкцию двух аргументов, это приведёт к включению нескольких реле одной командой. |
Ответ
REO00000000000008
- Relay Enabled OK, где00000000000008
- значение переданного аргумента при отправке команды.
Пример: TRD00000000000008
Команда: TRD
Аргумент: Значение двоичного логарифма в 16-тиричном формате
Команда для запроса на выключение одного реле, его номер определяется по аргументу, описанному в команде выше (TRE). Команда может принимать в себя дизъюнкцию двух аргументов, это приведёт к выключению нескольких реле одной командой.
Ответ
RDO00000000000008
- Relay Disabled OK, где00000000000008
- значение переданного аргумента при отправке команды.
Пример: SRS00000000000008
Команда: SRS
Аргумент: Значение двоичного логарифма в 16-тиричном формате
Команда для запроса на переключение состояния одного реле, его номер определяется по аргументу, описанному в команде выше (TRE).
Переключение происходит согласно принципу a = !a
, где "а" - состояние реле.
Команда может принимать в себя дизъюнкцию двух аргументов, это приведёт к переключению нескольких реле одной командой.
Ответ
RSO00000000000008
- Relay Switched OK, где00000000000008
- значение переданного аргумента при отправке команды.
Пример: CBV000000000000FF
Команда: CBV
Аргумент: Значение в 16-тиричном формате. Значимость определена для не более 2-х байт
Команда, служащая для изменения значения баланса, отображаемого на пользовательском экране устройства. Значения свыше 9999 (0x270F) будут игнорироваться и записываться как 9999.
Ответ
VBO000000000000FF
- Value Balance OK, где000000000000FF
- значение переданного аргумента при отправке команды.
Пример: CTV00000000000100
Команда: CTV
Аргумент: Значение в 16-тиричном формате. Значимость определена для не более 2-х байт
Команда, служащая для изменения значения остатка времени, отображаемого на пользовательском экране устройства. Передаётся количество секунд, в течение которых пользователю будет доступно устройство.
Например, при отправке команды CTV00000000000100
, переменная TIME будет установлена в значение 256 (т.к. 0x100 = 256). Это значит, что на экран будет выведено 4:16
, что символизирует 4 минуты 16 секунд.
Значения свыше 3599 (0xEOF) будут проигнорированы и записаны как 3599.
Ответ
VTO00000000000100
- Value Time OK, где00000000000100
- значение переданного аргумента при отправке команды.
Пример: ABP00000000000008
Событие: CTV
Полезная нагрузка: Значение двоичного логарифма в 16-тиричном формате. Значимость определена только для 1-го байта
Событие, сигнализирующее о нажатии кнопки на устройстве. В качестве полезной нагрузки приходит двоичный логарифм.
Например, ABP00000000000008
означает, что нажата кнопка номер 4 (т.к. 0x08 = 0b1000).
Пример: NCPFBC2BD1A552319
Событие: NCP
Полезная нагрузка: Значение в 16-тиричном формате
Событие, сигнализирующее о появлении новой карты на считывателе устройства. В качестве полезной нагрузки приходит 4-хбайтовый UID Mifare-карты.
Например, NCP0000001A552319
означает, что представлена карта с UID 1A:55:23:19
.
Пример: WCL00000000000000
Событие: WCL
Полезная нагрузка: Значение в 16-тиричном формате
Событие, сигнализирующее о снятии Mifare-карты со считывателя. В качестве полезной нагрузки приходит 4-хбайтовый UID Mifare-карты.
Например, WCL0000001A552319
означает, что со считывателя снята карта с UID 1A:55:23:19
. Рекомендуется не опираться на UID карты, т.к. микросхема RC522
умеет самостоятельно решать проблему с антиколлизией, потому если вдруг в створ считывателя попадёт больше одной карты, это не должно привести к проблемам, но стоит быть начеку!.