POS протокол последовательного порта связи - PullRequest
1 голос
/ 28 ноября 2011

У меня есть кассовый аппарат, с которым я пытаюсь связаться из 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 () работает для ЛЮБОГО индекса, который я выбираю, даже если он не следующий доступный.Может быть более старым, в этом случае он изменяет все или тот, который больше следующего.

Действительно раздражает необходимость делать это каждый раз, когда мне нужно хранить продукт.Что это?

Ответы [ 3 ]

2 голосов
/ 29 ноября 2011

После прочтения вашей спецификации и данных я думаю, что в конце отсутствует косая черта. В вашей спецификации вы написали:

Reply Packet Format:    "1/ITEM DESCRIPTION/1200.00/0.00/1/" if the item exists in the host database

Но в ваших открытых данных по проводу я увижу:

1/TEST ITEM /0000.66/0.00/1/36

Так что, возможно, последний слэш просто отсутствует. Также последний параметр - индекс отдела, которому принадлежит PLU . Возможно, это число также повлияет на то, что покажет касса.

Обновление

Хорошо, это была просто попытка. Теперь единственное, что мне приходит в голову, это вопрос: «Есть ли у вас система, которая может правильно передавать что-то в регистр?» Если да, вы можете подключить его ко второму последовательному порту вашего компьютера и написать небольшую программу, которая просто передает данные между обоими com-портами и дополнительно записывает их в файл. Таким образом, вы можете проверить данные, которые отправляет другая система, или у производителя есть демонстрационное приложение, из которого вы можете узнать точные данные, которые оно отправляет.

В заключение, но не в последнюю очередь, попросите производителя дать некоторые рекомендации, потому что он должен знать, как должны выглядеть данные (может быть, приведя вам пример?).

Кстати, вы уже прослушали некоторые последовательные данные, поэтому у вас должно быть приложение для этого. Мой любимый Бесплатный монитор последовательного порта .

1 голос
/ 30 ноября 2011

ОК, люди, я сделал это.На самом деле я должен быть в меню «Сохранить новый товар» (вручную) в кассе, чтобы главное приложение могло правильно хранить штрих-код.Я не знаю, почему это так (в нем хранятся все остальные поля), это не имеет смысла.Я полагаю, что производитель должен иметь возможность хранить штрих-код также через последовательный порт независимо от ввода вручную.

Что касается получения цены товара из основного приложения, я должен отправить только простой ответбез онлайн-заголовка (номер машины, номер клерка и т. д.), хотя в спецификации говорится, что я должен.У меня на самом деле есть 3 версии протокола, и наиболее подходящая версия ошибается.

Это означает, что я не могу разделить сигнал, и каждый кассовый аппарат отбрасывает ответ, который не предназначен для него.Думаю, я куплю дополнительный последовательный порт для ПК.Спасибо всем за ваши ответы.

1 голос
/ 28 ноября 2011

Убедитесь, что для кодировки последовательного порта задана кодовая страница ASCII.

например:.

        port = new SerialPort("COM" + PortNum.ToString(), 
           9600, Parity.None, 8, StopBits.Two);
        port.Encoding = Encoding.GetEncoding(28591);

Если вы отправляете символы Юникода, это может запутать устройство.

...