1. Общие положения
Контрольно-кассовая техника (далее — ККТ) УМКА-01-ФА предназначена для работы в составе автоматических устройств для расчетов (далее – АУР) при осуществлении расчетов на территории Российской Федерации в целях обеспечения интересов граждан и организаций, защиты прав потребителей, а также обеспечения установленного порядка осуществления расчетов, полноты учета выручки в организациях и у индивидуальных предпринимателей. Обмен данными между компьютером платёжного терминала и ПТК ведётся по интерфейсу RS – 232 со скоростью 1200, 2400, 4800, 9600, 14400, 38400, 58600 и 115200 бод и с физическим кадром:
- 1 стартовый бит;
- 8 битов данных;
- 1 стоповый бит;
- без проверки на четность;
- без управления потоком;
- 3 линии (TXD, RXD, GND).
Документ состоит из двух основных частей: «Нижний уровень» и «Верхний уровень».
Под командой понимается посылка, состоящая из кода команды и данных (они могут отсутствовать), которые определяют тип действия для ККТ. На каждую команду ККТ присылает ответ, содержащий код ошибки и данные (могут отсутствовать) в зависимости от команды.
Все команды и ответы передаются по единому протоколу нижнего уровня, который обеспечивает достоверность передачи данных с помощью механизма контрольных сумм и повторов. Таким образом, в разделе «Нижний уровень» описан общий для всех команд и ответов алгоритм их передачи и приема.
В разделе «Верхний уровень» описаны конкретные коды команд, передаваемые в них данные и форматы ответов на команды, а также возможные коды ошибок и их описание.
2. Нижний уровень
Нижний уровень условно разделен на две части, для реализации каждой из которых используется механизм, реализуемый другой его частью:
- транспортная часть отвечает за обмен пакетами по физическому уровню;
- буфер заданий осуществляет организацию очереди получаемых заданий.
При описании будем использовать условные обозначения:
- "Name" – имя константы (значения констант приведены в подразделе «Константы»).
- Name – имя переменной или параметра. При таком формате указания имени параметра учитывается только его наличие и положение относительно других параметров, а не его значение, размерность и т.п.
- Name [X] – имя переменной или параметра с указанием его фиксированной длины в байтах. Все параметры двоичные (беззнаковые), если в описании не указано иного. Если в скобках ничего не указано (пустые скобки), то считается, что длина параметра не предопределена (определяется другими параметрами).
Все передаваемые многобайтовые значения передаются по правилу «младший байт первым».
Константы
Транспортный уровень
Обозначение |
Код |
STX |
0xFE |
ESC |
0xFD |
TSTX |
0xEE |
TESC |
0xED |
Ошибки
Обозначение |
Код |
E_Overflow |
0xB1 |
E_AlreadyExists |
0xB2 |
E_NotFound |
0xB3 |
E_IllegalValue |
0xB4 |
Статус задания
Обозначение |
Код |
Pending |
0xA1 |
InProgress |
0xA2 |
Result |
0xA3 |
Error |
0xA4 |
Stopped |
0xA5 |
AsyncResult |
0xA6 |
AsyncError |
0xA7 |
Waiting |
0xA8 |
Команды буфера
Обозначение |
Код |
Add |
0xC1 |
Ack |
0xC2 |
Req |
0xC3 |
Abort |
0xC4 |
AckAdd |
0xC5 |
Транспортная часть
Структура пакета данных при обмене
Обмен в обоих направлениях производится пакетами с единой структурой:
Обозначение |
Описание |
Byte stuffing |
Для того чтобы байт "STX" не встречался в полях Data и CRC, при передаче байтов этих полей применяется маскирование (Byte stuffing): если очередной байт не равен "STX" или "ESC", то он передается как есть. Если байт равен "STX", то вместо него передается пара байтов: "ESC" и "TSTX". Если байт равен "ESC", то вместо него передается пара байтов: "ESC" и "TESC". Следует заметить, что байты, равные "TSTX" и "TESC", передаются как есть (без дополнения лишними байтами). Получение сочетания "ESC" + XX, где XX не равен "TSTX" или "TESC", считать нарушением обмена – пакет отбрасывать. |
Len |
Количество информационных байтов в поле Data. При передаче производится маскирование, поэтому количество байтов реально передаваемых по физическому каналу может быть больше указанного значения. Чтобы само поле Len не требовало маскирования нужно учитывать: ‒ допустимые значения 0x0000..0x7E7F, ‒ в младшем байте следует передавать младшие 7! (а не 8) битов значения длины (бит 7 содержит 0); ‒ а в старшем передавать остальные 8 бит. unsigned char* Buf; Buf [1] = (unsigned char) Len & 0x7F; Buf [2] = Len >> 7; //младший байт длины //старший байт длины |
Id |
По номеру Id можно определить, ответом на какой из пакетов данных ПК является этот пакет. То есть ПК нумерует отсылаемые пакеты по своему усмотрению, а ККТ в ответных пакетах указывает, что «это ответ на такой-то пакет ПК». Допустимые значения для id, используемых ПК, 0x00..0xDF. Остальные значения зарезервированы. |
Data
|
Это информационная часть пакета, которую транспортная часть протокола никак не интерпретирует (это делает вторая часть протокола – буфер заданий, подробнее смотрите в разделе «Буфер заданий»). |
CRC
|
Контрольная сумма CRC8 по полям Id и Data (с учетом маскирования). Начальное значение: 0xFF (Полином: x 8+x5+x4+1 / 0x31 / “CRC-8-Dallas/Maxim”). |
Логика работы
- Первым по каналу передается байт с индексом 0 (то есть "STX").
- ПК при формировании пакета может назначить любое допустимое значение Id.
Рекомендуется – монотонно нарастающее.
- ККТ, отвечая на пакет ПК, использует тот же Id.
- Если CRC не совпадает, то пакет отбрасывается.
- Если в середине пакета встретилось "STX", то предыдущая полученная часть пакета
игнорируется (отбрасывается) и начинается получение нового пакета.
- Если Id или Len имеют некорректное значение или ПК прислал неизвестную команду, то
ККТ шлет пакет без информационной части ("STX", 0x0000, Id, CRC) для сигнализации
об ошибке.
- Транспортный уровень получает пакеты в прерывании, там же их обрабатывает (не путать с «исполняет команды ККТ»).
- Так как команда верхнего уровня в ККТ может выполняться достаточно длительное время, то во время исполнения одной команды можно передать следующую команду. Реализация транспортного уровня ведется в прерываниях (UART), а исполнение команд верхнего уровня – в основном цикле MCU ККТ. То есть считается, что в ККТ есть два потока: транспортный уровень (прием пакетов) и верхний уровень (поток ККТ).
- Назовем команды верхнего уровня, доставленные в пакете транспортным уровнем из ПК, заданием.
- Транспортный уровень имеет команды Добавить задание в буфер, Получить результат исполнения задания, Очистить буфер заданий, которые исполняет в прерывании и сразу же отправляет ответный пакет (синхронно с точки зрения ПК).
-
Полученные задания транспортный уровень складывает в буфер FIFO (в прерывании).
- Основной поток MCU ККТ, реализующий функции ККТ, берет очередное задание из буфера, исполняет команду ККТ и складывает результат ее исполнения на место задания в буфер.
- ПК может командой (по транспортному уровню) запросить результат исполнения задания или указать, чтобы ККТ сразу после исполнения задания отправил в ПК (асинхронно с точки зрения ПК) пакет с результатом задания.
Добавить комментарий: