Estamos tratando de emular un teclado POS para integrar una aplicación con una aplicación de punto de venta existente.C# SerialPort - emular el teclado pos
Corrimos a través de este software: Virtual Serial Port Kit
Básicamente crea un par de puerto serie virtual para que los datos envían a COM1 puede salir de COM4 y viceversa. Esto permite que nuestra aplicación envíe datos a través de COM4 para que aparezca en la aplicación POS que está hablando con un teclado en COM1.
Bastante ingenioso, pero parece que hay algún tipo de señalización en curso que no somos capaces de replicar con la clase .Net System.IO.Ports.SerialPort ...
De lo que podemos decir de los programas de vigilancia del puerto serie, así es como funciona la secuencia de arranque: Comando
- 8 bytes enviado al teclado
- teclado emite un pitido
- algún tipo de señal se envía desde el teclado
- segunda orden de 8 bytes se envía al teclado, provocada por la señal
- teclado responde con la información del dispositivo y la versión
Al utilizar nuestro puerto serie virtual, no podemos encontrar la manera de replicar la señal enviada desde el teclado. Podemos ver todos los datos correctamente, por lo que creemos que la configuración en nuestro objeto SerialPort es correcta. Aquí hay un fragmento de nuestra configuración SERIALPORT:
_port.BaudRate= 9600;
_port.Parity = Parity.None;
_port.DataBits = 8;
_port.StopBits = StopBits.One;
_port.DtrEnable = true;
_port.RtsEnable = true;
También hay que destacar el uso de portmon vemos una solicitud GET_MODEM_STATUS que es lo que la aplicación POS está esperando antes de enviar el segundo comando.
¿Alguna idea sobre cómo diagnosticar esto? Como estamos usando .NET, esta situación es un poco más baja de lo que estamos acostumbrados.
ACTUALIZACIÓN: También quiero señalar que probamos el SDK aquí: Franson Serial Tools pero ni siquiera pudimos obtener los datos para pasar al usar este SDK.
ACTUALIZACIÓN: lo hemos descartado utilizando cualquier tipo de puerto serie virtual. Hemos obtenido un cable para ejecutar desde la PC POS a otra y podemos ver los datos que se aproximan para emular el teclado. Ahora nuestro problema es que no podemos encontrar la manera de señalar que el teclado está listo para recibir datos como lo menciona la respuesta principal. Parece que la aplicación POS envía el comando para emitir un pitido y espera hasta 3 segundos esperando una señal. Entonces se agota el tiempo cuando hablamos con nuestra aplicación, pero no cuando hablamos con el teclado real
¿Cómo podemos hacer esto con la clase SerialPort? Ya configuramos DtrEnable y RtsEnable en verdadero, ¿necesitamos establecer algo más? ¿O tenemos que usar un puerto serie p/invoke de menor nivel para lograr esto?
SOLUCIÓN:
_port.RtsEnabled = false;
Thread.Sleep(1000);
_port.RtsEnabled = true;
Esto hace que la aplicación POS creo que el teclado está enchufado, lo cual tiene sentido. Marcaré la respuesta # 1 como la respuesta ya que en gran medida nos ayudó a encontrar la solución.
Exactamente qué teclado POS está usando? –
Es un Fujitsu CL92R, también parece que la aplicación POS tiene que ejecutarse en una PC con la placa base TeamPOS.No hemos podido ejecutar la aplicación en una PC sin este hardware específico y exclusivo de Fujitsu. – jonathanpeppers
Su solución parece lógica. Sugerí a continuación que el TPV esperará a que se complete el restablecimiento antes de enviar más datos. Una forma de hacerlo es esperar un intervalo configurable (digamos 3000 ms) como sugerí a continuación. Sospecho que su aplicación POS realmente está esperando que RTS baje (reinicio iniciado) luego vuelva a subir (reinicio completado). – Joe