C # SerialPort - эмулировать pos-клавиатуру - PullRequest
5 голосов
/ 20 августа 2009

Мы пытаемся эмулировать POS-клавиатуру, чтобы интегрировать приложение с существующим приложением Point of Sale.

Мы столкнулись с этим программным обеспечением: Набор виртуальных последовательных портов

Он в основном создает пару виртуальных последовательных портов, чтобы данные, отправляемые на COM1, могли выходить из COM4 и наоборот. Это позволяет нашему приложению отправлять данные через COM4 для отображения в приложении POS, которое разговаривает с клавиатурой на COM1.

Довольно гениально, но, похоже, происходит какая-то сигнализация, которую мы не можем воспроизвести с помощью класса .Net System.IO.Ports.SerialPort ...

Из того, что мы можем сказать по программам мониторинга последовательного порта, так работает последовательность запуска:

  1. 8 байт Команда отправлена ​​на клавиатуру
  2. Звуковые сигналы клавиатуры
  3. Какой-то сигнал посылается с клавиатуры
  4. Вторая 8-байтовая команда отправляется на клавиатуру, активируется сигналом
  5. Ответы клавиатуры с информацией об устройстве и версии

При использовании нашего виртуального последовательного порта мы не можем понять, как реплицировать сигнал, отправленный с клавиатуры. Мы можем видеть, что все данные поступают правильно, поэтому мы считаем, что настройки нашего объекта SerialPort верны. Вот фрагмент наших настроек SerialPort:

_port.BaudRate= 9600;
_port.Parity = Parity.None;
_port.DataBits = 8;
_port.StopBits = StopBits.One;
_port.DtrEnable = true;
_port.RtsEnable = true;

Мы также заметили, что при использовании portmon мы видим запрос GET_MODEM_STATUS, который ожидает приложение POS перед отправкой второй команды.

Есть идеи, как это диагностировать? Поскольку мы используем .NET, вся эта ситуация немного ниже, чем мы привыкли.

ОБНОВЛЕНИЕ: Я также хочу отметить, что мы попробовали SDK здесь: Franson Serial Tools , но мы не могли даже получить данные для просмотра при использовании этого SDK.

ОБНОВЛЕНИЕ: Мы выбросили, используя любой виртуальный последовательный порт. Мы проложили кабель от компьютера POS к другому и можем видеть данные, имитирующие клавиатуру. Теперь наша проблема в том, что мы не можем понять, как сигнализировать, что клавиатура готова к получению данных, как упоминает главный ответ. Похоже, что приложение POS посылает команду, чтобы подать звуковой сигнал, и ожидает до 3 секунд в ожидании сигнала. Так что время ожидания при разговоре с нашим приложением, а не при разговоре с настоящей клавиатурой

Как мы можем сделать это с классом SerialPort? Мы уже установили для DtrEnable и RtsEnable значение true, нужно ли устанавливать что-то еще? Или мы должны использовать последовательный порт p / invoke более низкого уровня для достижения этой цели?

РЕШЕНИЕ:

_port.RtsEnabled = false;
Thread.Sleep(1000);
_port.RtsEnabled = true;

Это заставляет приложение POS думать, что клавиатура подключена, что имеет смысл. Я отмечу ответ № 1 как ответ, так как очень помог нам найти решение.

Ответы [ 2 ]

4 голосов
/ 20 августа 2009

РЕДАКТИРОВАНИЕ , чтобы дать больше перспективы с точки зрения симуляции клавиатуры.

Так получилось, что в далеком прошлом я написал низкоуровневые драйверы для клавиатуры 92R.

Вам действительно нужна документация для проприетарного протокола, чтобы сделать это правильно - например, команды, отправляемые на клавиатуру, содержат порядковый номер и контрольную сумму. Я бы рекомендовал связаться с Fujitsu и попытаться достать эту документацию.

Из того, что вы описали:

  • Первой 8-байтовой командой, которую вы послали, была, вероятно, команда сброса (так как это вызвало звуковой сигнал клавиатуры). Клавиатура отправляет ответ для подтверждения команды, а затем сбрасывает себя.

  • После отправки команды сброса приложение POS должно дождаться сброса клавиатуры (я думаю, около 3000 мс), прежде чем отправлять другие команды.

  • Похоже, что вторая посылка - это команда для запроса версии прошивки.

  • Приложение POS также должно будет впоследствии отправить команду для включения «автоматического ввода» до того, как клавиатура действительно отправит нажатия клавиш.

  • Также доступны команды для запроса положения блокировки клавиш, включения тонального генератора, включения / выключения MSR и записи на дополнительный встроенный 2-строчный дисплей. Таким образом, ваш симулятор должен быть способен воспроизводить ответы на эти команды.

  • Как только приложение POS включило «автоматический ввод», клавиатура будет отправлять нежелательные сообщения с нажатой клавишей (или изменением положения блокировки, или вводом MSR). IIRC эти сообщения также имеют порядковый номер и контрольную сумму, которые вам нужно будет воспроизвести в симуляторе.

Единственная известная мне сигнализация - клавиатура вызывает CTS, когда она готова к приему данных. Если вы соединяете два порта на ПК, вам нужен специальный нуль-модемный кабель (см. Ниже), чтобы при повышении RTS вашего симулятора на COM4 он отображался как CTS на другом порту.

COM-порты на материнской плате TeamPOS обеспечивают питание клавиатуры. Возможно, вы не хотите подключать эти контакты к вашему порту COM4, ​​поэтому я бы предложил использовать нуль-модемный кабель, который подключает только следующие контакты:

2 (данные Tx) - 3 (данные Rx)

3 (данные Rx) - 2 (данные Tx)

7 (RTS) - 8 (CTS)

8 (CTS) - 7 (RTS)

0 голосов
/ 20 августа 2009

Я не занимался разработкой последовательного порта в течение многих лет, но когда я делал это, я всегда использовал Crossover Cable и второй ПК под управлением Windows HyperTerminal.

...