У меня есть кассовый аппарат, с которым я пытаюсь связаться из C # (я не использую POS для .NET).По сути, я хочу, чтобы он извлекал элементы из базы данных моего приложения.
Таким образом, кассовый аппарат отправляет эту строку на главный компьютер приложения через последовательный порт: • КОМАНДА: Пакет поиска элементов
Command Short Description: "Searches PC for a PLU code"
Data Send Example Format: ?/1234567890123/
"/" является разделителем поля пакета.Номер - это штрих-код предмета для поиска."?"является дескриптором пакета, который означает, что это пакет, который запрашивает информацию об элементе.
На что я должен ответить ПАКЕТОМ ДАННЫХ ОТВЕТА
Reply Packet Format: "1/ITEM DESCRIPTION/1200.00/0.00/1/" if the item exists in the host database
ИЛИ
"0/" if it does not exist in which it will search its internal memory for it
И протокол определяет правила связи:
ECR/POS HOST COMPUTER
Idle
Idle
Enquire(ENQ)
Acknowledge(ACK)
Packet("?/1234567890123/")
Acknowledge(ACK)
Packet("1/ITEM DESCRIPTION/1200.00/0.00/1/")
Acknowledge(ACK)
Idle
Idle
ENQ, ACK - управляющие коды ASCII.Если пакет создан неправильно, я получаю NAK обратно.
Характеристики поля:
==== Field 1: Found flag
Type: FLAG
Length: 1
Notes: This flag must be zero when item could not be found
in the database, else (if found) it must be set to
one. In the 1st case, the rest of the fields must
not be sent.
==== Field 2: Item description
Type: STRING
Length: Variable, 1-20 characters
Notes: The PLU description for the requested code
==== Field 3: Item unit price
Type: AMOUNT
Length: Default
Notes: This is the unit price for the requested code
==== Field 4: Item discount amount
Type: AMOUNT
Length: Default
Notes: This is an auto-discount value for this PLU
==== Field 5: Department
Type: INTEGER
Length: 1
Notes: It is the department index which the PLU belongs
Я хочу получить цену из приложения хоста.Проблема в том, что регистр принимает мой ответный пакет как действительный (он отправляет ACK обратно через последовательный порт), но на своем собственном ЖК-экране появляется сообщение «ОШИБКА: НЕ СУЩЕСТВУЮЩИЙ ПУНКТ».Это как если бы я послал флаг «0». Я понятия не имею, в чем может быть проблема.Я в отчаянии.
Дело в том, что регистр запрашивает у хост-компьютера цену, а если он не может его найти, он запрашивает собственную внутреннюю память (может хранить до 4000 элементов).Если я храню элемент вручную во внутренней памяти, я могу изменить его атрибуты (цену, описание и т. Д.) Из хост-приложения.
Я даже не могу программно добавить элемент во внутреннюю память, хотя я также получаю «ОК».'(ACK) из последовательного протокола связи.Таким образом, я мог бы добавить элементы программным способом и заставить их извлекать их из собственной внутренней памяти.
Я могу просто сохранить каждый элемент вручную, а затем, если он существует во внутренней памяти, я могу изменить его так, как захочу изхост-приложение (изменение цены, описание и т. д.).Тогда он может получить цену, которую я установил для него во внутренней памяти.Это действительно утомительно, хотя.Первоначально мне пришлось бы хранить все вручную один раз, и у меня есть 2 кассовых аппарата одного типа.То, что я хочу, это хранить ничего внутри, но вытащить все с хоста.
Пожалуйста, помогите.У меня нет идей.
РЕДАКТИРОВАТЬ: это перехват пакета, который я обнаружил
# TIME PORT DATA ASCII
000044 13:52:03.437 COM2 >> 05 .
000045 13:52:03.437 COM2 << 06 .
000046 13:52:03.453 COM2 >> 02 30 31 2F 30 31 2F 32 2F 30 30 2F 3F 2F 39 39 .01/01/2/00/?/99
39 20 20 20 20 20 20 20 20 20 20 2F 31 2F 34 38 9 /1/48
03 06 ..
000049 13:52:03.453 COM2 << 06 02 30 31 2F 30 31 2F 32 2F 30 30 2F 31 2F 54 ..01/01/2/00/1/T
45 53 54 20 49 54 45 4D 20 2F 30 30 30 30 2E 36 EST ITEM /0000.6
36 2F 30 2E 30 30 2F 31 2F 33 36 03 6/0.00/1/36.
Часть "01/01/2/00 /" - это заголовок онлайн-пакета, который включает в себяномер машины, клерк и т. д. Каждый пакет начинается с 0x02 (STX) и заканчивается 0x03 (ETX).Поле перед последним является номером контрольной суммы пакета, который, если я ошибаюсь, отправляет обратно NAK.
Кажется, он отправляет обратно ACK, даже если я получаю неправильные поля.Он просто проверяет контрольную сумму.Протокол здесь https://rapidshare.com/files/1772287788/DL_Protocol.doc
* ОБНОВЛЕНИЕ: *
Кажется, он ведет себя довольно странно.Я могу записать в его внутреннюю память (сохранить элемент) и изменить любое поле существующего элемента, кроме штрих-кода элемента.Я просто храню в любом из 4000 индексов, которые я хочу.Однако если я войду в меню регистра извне (с его собственной клавиатуры) в подменю хранения элементов, нажмите «сохранить новый элемент», а затем вернусь на экран «продажи» БЕЗ фактического сохранения чего-либо вообще, просто отменив все пути назад, он на самом деле сохраняет каждое поле в следующий раз.То есть он также хранит штрих-код для следующей команды Set_PLU (), которую я ему даю (точно такая же команда, которая ранее не смогла сохранить штрих-код), независимо от того, является ли это новой записью или модифицирует старую (по сути, позицию индекса, которую я даю)Это).
Забавно, что, когда я захожу в «меню нового элемента магазина», он дает мне новый штрих-код для ввода.Если я наберу один, он автоматически сохранится в следующем доступном индексе.Я просто отменяю, ничего не печатая.Следующая команда Set_PLU () работает для ЛЮБОГО индекса, который я выбираю, даже если он не следующий доступный.Может быть более старым, в этом случае он изменяет все или тот, который больше следующего.
Действительно раздражает необходимость делать это каждый раз, когда мне нужно хранить продукт.Что это?