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”).

 

Логика работы

  1. Первым по каналу передается байт с индексом 0 (то есть "STX").
  2. ПК при формировании пакета может назначить любое допустимое значение Id.

Рекомендуется – монотонно нарастающее.

  1. ККТ, отвечая на пакет ПК, использует тот же Id.
  2. Если CRC не совпадает, то пакет отбрасывается.
  3. Если в середине пакета встретилось "STX", то предыдущая полученная часть пакета

игнорируется (отбрасывается) и начинается получение нового пакета.

  1. Если Id или Len имеют некорректное значение или ПК прислал неизвестную команду, то

ККТ шлет пакет без информационной части ("STX", 0x0000, Id, CRC) для сигнализации

об ошибке.

  1. Транспортный уровень получает пакеты в прерывании, там же их обрабатывает (не путать с «исполняет команды ККТ»).
  2. Так как команда верхнего уровня в ККТ может выполняться достаточно длительное время, то во время исполнения одной команды можно передать следующую команду. Реализация транспортного уровня ведется в прерываниях (UART), а исполнение команд верхнего уровня – в основном цикле MCU ККТ. То есть считается, что в ККТ есть два потока: транспортный уровень (прием пакетов) и верхний уровень (поток ККТ).
  3. Назовем команды верхнего уровня, доставленные в пакете транспортным уровнем из ПК, заданием.
  4. Транспортный уровень имеет команды Добавить задание в буфер, Получить результат исполнения задания, Очистить буфер заданий, которые исполняет в прерывании и сразу же отправляет ответный пакет (синхронно с точки зрения ПК).
  5. Полученные задания транспортный уровень складывает в буфер FIFO (в прерывании).

    1. Основной поток MCU ККТ, реализующий функции ККТ, берет очередное задание из буфера, исполняет команду ККТ и складывает результат ее исполнения на место задания в буфер.
    2. ПК может командой (по транспортному уровню) запросить результат исполнения задания или указать, чтобы ККТ сразу после исполнения задания отправил в ПК (асинхронно с точки зрения ПК) пакет с результатом задания.