2009-08-20 12 views
5

Stiamo cercando di emulare una tastiera POS per integrare un'applicazione con un'applicazione Point of Sale esistente.C# SerialPort - emula la tastiera pos

ci siamo imbattuti in questo software: Virtual Serial Port Kit

Si crea in pratica un paio porta seriale virtuale in modo che dati alla COM1 può uscire di COM4 e viceversa. Ciò consente alla nostra applicazione di inviare dati tramite COM4 per apparire all'applicazione POS che sta parlando a una tastiera su COM1.

Piuttosto ingegnoso, ma sembra che ci sia un qualche tipo di segnalazione in corso che non siamo in grado di replicare con la classe .NET System.IO.Ports.SerialPort ...

Da quello che possiamo dire da programmi di monitoraggio porta seriale, questo è come funziona la sequenza di avvio: comando

  1. 8 byte inviato alla tastiera
  2. tastiera emette
  3. qualche tipo di segnale viene inviato dalla tastiera
  4. secondo comando di 8 byte viene inviato alla tastiera, innescata dal segnale
  5. tastiera risponde con informazioni sul dispositivo e la versione

Quando si utilizza la nostra porta seriale virtuale, non possiamo capire come replicare il segnale inviato dal tastiera. Possiamo vedere tutti i dati che arrivano correttamente, quindi crediamo che le impostazioni sul nostro oggetto SerialPort siano corrette. Ecco un frammento delle nostre impostazioni SerialPort:

_port.BaudRate= 9600; 
_port.Parity = Parity.None; 
_port.DataBits = 8; 
_port.StopBits = StopBits.One; 
_port.DtrEnable = true; 
_port.RtsEnable = true; 

Abbiamo anche notato usare portmon vediamo una richiesta GET_MODEM_STATUS che è ciò che l'applicazione POS è in attesa prima di inviare il secondo comando.

Qualche idea su come diagnosticare questo? Dato che stiamo usando .NET, l'intera situazione è un po 'più bassa di quanto siamo abituati.

AGGIORNAMENTO: Voglio anche notare che abbiamo provato l'SDK qui: Franson Serial Tools ma non siamo riusciti a ottenere i dati da trasferire quando si utilizza questo SDK.

AGGIORNAMENTO: Abbiamo eliminato utilizzando qualsiasi tipo di porta seriale virtuale. Abbiamo ottenuto un cavo per l'esecuzione dal PC POS a un altro e può vedere i dati in arrivo per emulare la tastiera. Ora il nostro problema è che non riusciamo a capire come segnalare che la tastiera è pronta per ricevere i dati come menziona la risposta più importante. Sembra che l'applicazione POS invii il comando a emettere un segnale acustico fino a 3 secondi in attesa di un segnale. Quindi va in timeout quando si parla con la nostra applicazione, ma non quando si parla con la tastiera reale

Come possiamo farlo con la classe SerialPort? Abbiamo già impostato DtrEnable e RtsEnable su true, dobbiamo impostare qualcos'altro? O dobbiamo usare una porta seriale di livello inferiore p/invoke per realizzare questo?

SOLUZIONE:

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

Questo rende l'applicazione POS credo che la tastiera sia collegata, che ha un senso. Contrassegnerò la risposta n. 1 come risposta dal momento che lo notevolmente ci ha aiutato a trovare la soluzione.

+0

esattamente quale tastiera POS stai usando? –

+0

È un Fujitsu CL92R, sembra anche che l'applicazione POS debba funzionare su un PC con la scheda madre di TeamPOS.Non siamo stati in grado di eseguire l'applicazione su un PC senza questo hardware Fujitsu specifico e proprietario. – jonathanpeppers

+0

La tua soluzione sembra logica. Ho suggerito di seguito che il POS attenderà il completamento del ripristino prima di inviare altri dati. Un modo per farlo è aspettare un intervallo configurabile (diciamo 3000 ms) come suggerito di seguito. Sospetto che la tua app POS stia effettivamente aspettando che RTS si spenga (reset avviato) e poi ritorna di nuovo (reset completato). – Joe

risposta

4

MODIFICATO per dare più prospettiva dal punto di vista della simulazione della tastiera.

Come spesso ho scritto driver di basso livello per la tastiera 92R nel lontano passato.

È davvero necessario che la documentazione del protocollo proprietario lo faccia correttamente, ad esempio i comandi inviati alla tastiera contengono un numero di sequenza e un checksum. Ti consiglio di contattare Fujitsu e provare a procurarti questa documentazione.

Da quello che hai descritto:

  • Il primo comando di 8 byte hai mandato era probabilmente un comando di reset (come ha causato la tastiera per bip). La tastiera invia una risposta per riconoscere il comando, quindi si reimposta.

  • Dopo aver inviato un comando di ripristino, l'applicazione POS deve attendere il reset della tastiera (penso a circa 3000 ms) prima di inviare altri comandi.

  • Sembra che il secondo invio sia un comando per richiedere la versione del firmware.

  • L'app POS dovrà inoltre inviare un comando per abilitare "autoinput" prima che la tastiera invii effettivamente i tasti.

  • Sono disponibili anche i comandi per richiedere la posizione del blocco tasti, attivare il generatore di suoni, abilitare/disabilitare l'MSR e scrivere sul display opzionale a 2 righe incorporato. Quindi il tuo simulatore dovrà essere in grado di riprodurre le risposte a questi comandi.

  • Una volta che l'applicazione POS ha abilitato "autoinput", la tastiera invierà messaggi non richiesti con le sequenze di tasti premute (o cambi di posizione keylock o ingresso MSR). IIRC questi messaggi hanno anche un numero di sequenza e un checksum che dovrai riprodurre nel tuo simulatore.

L'unica segnalazione che so è che la tastiera solleva CTS quando è pronta per ricevere i dati. Se si collegano due porte su un PC, è necessario un cavo null modem speciale (vedere di seguito) in modo che quando il simulatore solleva RTS su COM4 verrà visto come CTS sull'altra porta.

Le porte COM su una scheda madre di TeamPOS forniscono alimentazione alla tastiera. Probabilmente non si vuole connettere questi pin alla porta COM4, ​​quindi vi suggerirei di usare un cavo null modem che si connette solo i seguenti pin:

2 (dati Tx) - 3 (dati Rx)

3 (dati Rx) - 2 (dati Tx)

7 (RTS) - 8 (CTS)

8 (CTS) - 7 (RTS)

+0

Ottima risposta. Abbiamo già invertito il checksum e la maggior parte dei comandi, è qualcosa che siamo abituati a fare. Tuttavia, non tutti abbiamo dovuto fare i conti con le porte seriali prima - deve essere qualcosa che accade sotto la cappa nella classe SerialPort .Net o qualcosa che usano solo dispositivi più vecchi. Si scopre che la porta COM virtuale che stiamo utilizzando non supporta la segnalazione su CTS o RTS, e questo è probabilmente il nostro problema. Cercheremo il cavo corretto che hai menzionato e ti informeremo sui nostri risultati. – jonathanpeppers

+0

Bene, siamo stati in grado di creare il tuo cavo. Abbiamo preso un cavo null modem collegato a un convertitore femmina-maschio e abbiamo rotto tutti i pin che non erano necessari. Ma ora siamo praticamente allo stesso punto in cui eravamo con la porta virtuale. Non siamo sicuri di come inviare il segnale inviato dalla tastiera. Net, aggiornerò la mia domanda. – jonathanpeppers

+0

Avuto una domanda veloce, ogni tanto il driver della tastiera (FjrKbdPO.exe) smette di essere in grado di parlare con la nostra tastiera emulata, evento anche se la comunicazione che passa attraverso sembra completamente normale. Il riavvio del computer risolve questo problema. Qualche idea su cosa potrebbe succedere? – jonathanpeppers

0

Non ho fatto lo sviluppo della porta seriale per anni, ma quando l'ho fatto ho sempre usato uno Crossover Cable e un secondo PC con Windows HyperTerminal.

+0

Proveremo questo e ti faremo sapere i nostri risultati, questo sarebbe positivo perché non dobbiamo fare affidamento su un programma seriale di terze parti. Potremmo semplicemente collegare il cavo a un PC diverso. – jonathanpeppers

+0

Non sembra funzionare, il PC ha un'estremità femminile per questa tastiera mentre una normale porta RS232 è maschio. Così abbiamo provato un cavo RS232 standard (maschio a un'estremità, femmina sull'altro) per passare dal PC POS a un altro, ma nessun dato sembrava passare attraverso. Abbiamo bisogno di un cavo speciale per vederlo funzionare? Il tuo link ha una foto di un cavo null modem che è femmina su entrambe le estremità, che non funzionerà per questo dispositivo. – jonathanpeppers

+0

Una porta maschio sul tuo PC ?! Questo è strano. Se vuoi davvero andare su hard-core su RS-232 hai bisogno di una scatola di breakout come questa http://uk.rs-online.com/web/search/searchBrowseAction.html?method=getProduct&R=4100457 –