Мы пытаемся эмулировать клавиатуру POS, чтобы интегрировать приложение с существующим приложением Point of Sale.C# SerialPort - emulate pos клавиатура
Мы натыкался на это программное обеспечение: Virtual Serial Port Kit
Это в основном создает виртуальный последовательный порт пары, так что передача данных к COM1 может выйти из COM4, и наоборот. Это позволяет нашему приложению отправлять данные через COM4, чтобы они отображались в POS-приложении, что он разговаривает с клавиатурой на COM1.
Довольно изобретательный, но это, кажется, есть какой-то сигнализации происходит, что мы не можем повторить с классом .Net System.IO.Ports.SerialPort ...
Из того, что мы можем сказать, из последовательные программы мониторинга портов, это как последовательность запуска работы:
- 8 байт команды отправляется клавиатуры
- клавиатура подает звуковой сигнал
- какой-то сигнал посылается с клавиатуры
- Вторая команда 8 байт отправляется клавиатуры, срабатывает по сигналу
- 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 как ответ, так как он сильно помог нам найти решение.
Какие именно POS-клавиатуры вы используете? –
Это Fujitsu CL92R, также похоже, что приложение POS должно работать на ПК с материнской платой TeamPOS.Мы не смогли запустить приложение на ПК без этого специального и запатентованного оборудования Fujitsu. – jonathanpeppers
Ваше решение звучит логично. Я предложил ниже, что POS будет ждать завершения сброса, прежде чем отправлять больше данных. Один из способов сделать это - подождать настраиваемый интервал (скажем, 3000 мс), как я предложил ниже. Я подозреваю, что ваше приложение POS действительно ждет, пока RTS спустится (перезагрузка началась), а затем снова вернется (сброс завершен). – Joe