2009-08-20 3 views
5

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

Мы натыкался на это программное обеспечение: Virtual Serial Port Kit

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

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

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

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

При использовании нашего виртуального последовательного порта, мы не можем понять, как повторить сигнал, посланный из клавиатура. Мы можем видеть, что все данные поступают правильно, поэтому мы считаем, что настройки на нашем объекте 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/inv для более низкого уровня для этого?

РЕШЕНИЕ:

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

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

+0

Какие именно POS-клавиатуры вы используете? –

+0

Это Fujitsu CL92R, также похоже, что приложение POS должно работать на ПК с материнской платой TeamPOS.Мы не смогли запустить приложение на ПК без этого специального и запатентованного оборудования Fujitsu. – jonathanpeppers

+0

Ваше решение звучит логично. Я предложил ниже, что POS будет ждать завершения сброса, прежде чем отправлять больше данных. Один из способов сделать это - подождать настраиваемый интервал (скажем, 3000 мс), как я предложил ниже. Я подозреваю, что ваше приложение POS действительно ждет, пока RTS спустится (перезагрузка началась), а затем снова вернется (сброс завершен). – Joe

ответ

4

EDITED, чтобы дать больше перспективы с точки зрения имитации клавиатуры.

Как бы то ни было, я написал низкоуровневые драйверы для клавиатуры 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 (данные Тх)

7 (РТС) - 8 (CTS)

8 (CTS) - 7 (РТС)

+0

Отличный ответ. Мы уже обратили внимание на контрольную сумму и большинство команд - это то, что мы привыкли делать. Тем не менее, нам не приходилось сталкиваться с сигнализацией о последовательных портах раньше - это должно быть что-то, что происходит под капотом в классе .Net SerialPort или чем-то более старым устройствам. Оказывается, виртуальный COM-порт, который мы используем, не поддерживает передачу сигналов через CTS или RTS, и это, вероятно, наша проблема. Мы изучим соответствующий кабель, который вы упомянули, и сообщите нам о наших результатах. – jonathanpeppers

+0

Ну, мы смогли создать ваш кабель. Мы взяли нуль-модемный кабель, подключенный к конвертеру от женщины к мужчине, и сломали все булавки, которые не нужны. Но теперь мы в основном в том же месте, где находимся с виртуальным портом. Мы не знаем, как отправить сигнал, который посылает клавиатура с .Net, я обновлю свой вопрос. – jonathanpeppers

+0

Если бы у вас был быстрый вопрос, то время от времени драйвер клавиатуры (FjrKbdPO.exe) перестает быть в состоянии говорить с нашей эмулируемой клавиатурой, событие, хотя проходящее через него сообщение выглядит совершенно нормально. Эта проблема возникает при перезагрузке компьютера. Любые идеи о том, что может происходить? – jonathanpeppers

0

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

+0

Мы попробуем это и сообщим вам о наших результатах, это было бы хорошо, потому что нам не нужно полагаться на стороннюю серийную программу. Мы могли бы просто подключить кабель к другому ПК. – jonathanpeppers

+0

Кажется, что не работает, ПК имеет женский конец для этой клавиатуры, в то время как обычный порт RS232 является мужским. Поэтому мы попробовали стандартный кабель RS232 (один на один, самка на другом), чтобы перейти от ПК POS к другому, но никаких данных, казалось, не было. Нужен ли нам специальный кабель, чтобы он работал? На вашей ссылке был изображен нуль-модемный кабель, который является женским на обоих концах, что не будет работать для этого устройства. – jonathanpeppers

+0

Мужской порт на вашем компьютере ?! Это странно. Если вы действительно хотите перейти на жесткий диск на RS-232, вам понадобится вырезка, подобная этой http://uk.rs-online.com/web/search/searchBrowseAction.html?method=getProduct&R=4100457 –