2009-08-20 45 views
5

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

  1. 8 bytes enviado al teclado
  2. teclado emite un pitido
  3. algún tipo de señal se envía desde el teclado
  4. segunda orden de 8 bytes se envía al teclado, provocada por la señal
  5. 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.

+0

Exactamente qué teclado POS está usando? –

+0

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

+0

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

Respuesta

4

EDITAR para dar más perspectiva desde el punto de vista de la simulación del teclado.

Da la casualidad que he escrito controladores de bajo nivel para el teclado 92R en el pasado distante.

que realmente necesita la documentación del protocolo propietario para hacer esto correctamente - por ejemplo comandos enviados al teclado contienen un número de secuencia y una suma de comprobación. Recomiendo ponerse en contacto con Fujitsu e intentar obtener esta documentación.

De lo que has descrito:

  • El primer comando de 8 bytes que envió fue probablemente una orden de reinicio (ya que causó el teclado emita un pitido). El teclado envía una respuesta para confirmar el comando y luego se reinicia.

  • Después de enviar un comando de restablecimiento, la aplicación POS tiene que esperar a que el teclado para restablecer (pienso en 3000 ms) antes de enviar otros comandos.

  • Parece que el segundo envío es una orden para solicitar la versión del firmware.

  • La aplicación POS también tendrá que enviar posteriormente un comando para habilitar "entrada automática" antes de que el teclado en realidad enviar pulsaciones de teclas.

  • También hay comandos disponibles para solicitar la posición de bloqueo de teclas, hacer sonar el generador de tonos, habilitar/deshabilitar el MSR y escribir en la pantalla incrustada opcional de 2 líneas. Por lo tanto, su simulador deberá ser capaz de reproducir las respuestas a estos comandos.

  • Una vez que la aplicación POS ha habilitado la "autoinput", el teclado enviará mensajes no solicitados con las teclas presionadas (o la posición del bloqueo de teclas cambia, o la entrada MSR). IIRC estos mensajes también tienen un número de secuencia y suma de comprobación que necesitará reproducir en su simulador.

La única señal que conozco es que el teclado levanta CTS cuando está listo para recibir datos. Si conecta dos puertos en una PC, necesita un cable de módem nulo especial (consulte a continuación) para que cuando su simulador active RTS en COM4 se vea como CTS en el otro puerto.

Los puertos COM en una placa base TeamPOS proporcionan alimentación al teclado. Es probable que no desea conectar estos pines al puerto COM4, ​​por lo que se recomienda usar un cable de conexión que conecta solamente los siguientes pines:

2 (datos TX) - 3 (datos Rx)

3 (datos Rx) - 2 (datos Tx)

7 (RTS) - 8 (CTS)

8 (CTS) - 7 (RTS)

+0

Excelente respuesta. Ya hemos modificado la suma de control y la mayoría de los comandos, es algo a lo que estamos acostumbrados. Sin embargo, no todos hemos tenido que preocuparnos por la señalización en puertos serie antes: debe ser algo que sucede bajo el capó en la clase SerialPort de .NET o algo que solo usan los dispositivos más antiguos. Resulta que el puerto COM virtual que estamos usando no admite la señalización sobre CTS o RTS, y ese es probablemente nuestro problema. Investigaremos el cable adecuado que mencionó y le informaremos nuestros resultados. – jonathanpeppers

+0

Bueno, pudimos crear su cable. Tomamos un cable de módem nulo conectado a un convertidor de hombre a hombre y rompimos todos los pasadores que no eran necesarios. Pero ahora estamos básicamente en el mismo punto donde estábamos con el puerto virtual. No estamos seguros de cómo enviar la señal de que el teclado está enviando desde .Net, actualizaré mi pregunta. – jonathanpeppers

+0

Tuve una pregunta rápida, de vez en cuando el controlador del teclado (FjrKbdPO.exe) deja de poder hablar con nuestro teclado emulado, aunque la comunicación que se muestra parece completamente normal. Reiniciar la computadora corrige este problema. Alguna idea sobre lo que podría estar pasando? – jonathanpeppers

0

No he hecho el desarrollo del puerto serie durante años, pero cuando lo hacía, siempre se usa un Crossover Cable y un segundo PC con Windows HyperTerminal.

+0

Intentaremos esto y le haremos saber nuestros resultados, esto sería bueno porque no tenemos que depender de un programa en serie de terceros. Podríamos simplemente conectar el cable a una PC diferente. – jonathanpeppers

+0

Parece que no funciona, la PC tiene un extremo hembra para este teclado, mientras que un puerto RS232 normal es masculino. Así que probamos un cable estándar RS232 (un extremo masculino, una hembra en el otro) para pasar de la PC POS a otra, pero no parecía que se obtuvieran datos. ¿Necesitamos un cable especial para que funcione? Su enlace tenía una imagen de un cable de módem nulo que es hembra en ambos extremos, lo que no funcionará para este dispositivo. – jonathanpeppers

+0

¿Un puerto macho en tu PC? Eso es raro. Si realmente quieres convertirte en un núcleo duro en RS-232, necesitas un recuadro como este http://es.online.store.com/web/search/searchBrowseAction.html?method=getProduct&R=4100457 –