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
- 8 byte inviato alla tastiera
- tastiera emette
- qualche tipo di segnale viene inviato dalla tastiera
- secondo comando di 8 byte viene inviato alla tastiera, innescata dal segnale
- 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.
esattamente quale tastiera POS stai usando? –
È 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
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