Мы пытаемся эмулировать POS-клавиатуру, чтобы интегрировать приложение с существующим приложением Point of Sale.
Мы столкнулись с этим программным обеспечением: Набор виртуальных последовательных портов
Он в основном создает пару виртуальных последовательных портов, чтобы данные, отправляемые на COM1, могли выходить из COM4 и наоборот. Это позволяет нашему приложению отправлять данные через COM4 для отображения в приложении POS, которое разговаривает с клавиатурой на COM1.
Довольно гениально, но, похоже, происходит какая-то сигнализация, которую мы не можем воспроизвести с помощью класса .Net System.IO.Ports.SerialPort ...
Из того, что мы можем сказать по программам мониторинга последовательного порта, так работает последовательность запуска:
- 8 байт Команда отправлена на клавиатуру
- Звуковые сигналы клавиатуры
- Какой-то сигнал посылается с клавиатуры
- Вторая 8-байтовая команда отправляется на клавиатуру, активируется сигналом
- Ответы клавиатуры с информацией об устройстве и версии
При использовании нашего виртуального последовательного порта мы не можем понять, как реплицировать сигнал, отправленный с клавиатуры. Мы можем видеть, что все данные поступают правильно, поэтому мы считаем, что настройки нашего объекта 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 как ответ, так как очень помог нам найти решение.