Guida una stampante POS tramite USB in c # [chiuso]
-
06-07-2019 - |
Domanda
Qualche idea su come posso guidare al meglio una stampante POS USB da c #. Le stampanti POS sono generalmente seriali, basate su TCP / IP o USB. So come realizzare seriale e TCP / IP ma non ho idea delle comunicazioni tramite USB in C #. So che esiste un livello disponibile da Microsoft chiamato POS.NET, ma voglio provare a evitarlo. Tutte le idee o le librerie C # che le persone possono consigliare sarebbero davvero apprezzate. Grazie
Soluzione
Dovresti davvero considerare l'utilizzo di POS per .NET e OPOS o oggetti di servizio .NET (Epson, ad esempio, fornisce entrambi). POS per .NET è conforme allo standard di settore UnifiedPOS per l'interfaccia con questi dispositivi.
Altri suggerimenti
Se la stampante si registra come dispositivo di interfaccia umana, è possibile P / INVOKE nelle API Win32 appropriate . Ecco le firme:
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_FlushQueue( SafeFileHandle HidDeviceObject );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_FreePreparsedData( ref IntPtr PreparsedData );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_GetAttributes( SafeFileHandle HidDeviceObject
, ref HIDD_ATTRIBUTES Attributes );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_GetFeature( SafeFileHandle HidDeviceObject
, ref Byte lpReportBuffer
, Int32 ReportBufferLength );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_GetInputReport( SafeFileHandle HidDeviceObject
,ref Byte lpReportBuffer
,Int32 ReportBufferLength );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern void HidD_GetHidGuid( ref System.Guid HidGuid );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_GetNumInputBuffers( SafeFileHandle HidDeviceObject
, ref Int32 NumberBuffers );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_GetPreparsedData( SafeFileHandle HidDeviceObject
,ref IntPtr PreparsedData );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_SetFeature( SafeFileHandle HidDeviceObject
, ref Byte lpReportBuffer
, Int32 ReportBufferLength );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_SetNumInputBuffers( SafeFileHandle HidDeviceObject
,Int32 NumberBuffers );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Boolean
HidD_SetOutputReport( SafeFileHandle HidDeviceObject
,ref Byte lpReportBuffer
,Int32 ReportBufferLength );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Int32
HidP_GetCaps( IntPtr PreparsedData, ref HIDP_CAPS Capabilities );
[ DllImport( "hid.dll", SetLastError=true ) ]
public static extern Int32
HidP_GetValueCaps( Int16 ReportType
, ref Byte ValueCaps
, ref Int16 ValueCapsLength
, IntPtr PreparsedData );
Esiste un wrapper C # per API USP Win32 dei ragazzi icsharpcode qui e Ho visto almeno uno altro riferimento a Roba USB in .Net.
Ciò che può essere difficile è se la stampante richiede o meno OPOS per funzionare. Alcuni anni fa ho lavorato su un progetto POS in .Net e da quello che ricordo OPOS è praticamente lo standard per il lato hardware delle cose (e al momento tutte le API OPOS utilizzavano l'interoperabilità COM). I dispositivi a volte hanno anche un protocollo di comunicazione proprietario documentato, nel qual caso dovresti essere in grado di utilizzarlo per parlare con il dispositivo utilizzando la libreria USB.
Se hai già inserito il tuo codice di controllo della stampante, puoi passare i comandi direttamente alla stampante impostando la stampante usando " Generic / Text " driver della stampante sulla porta USB. Quel driver non reinterpreterà i codici di controllo e proverà a stamparli, ma li passerà alla stampante così com'è.
Quindi la porta USB può essere utilizzata come qualsiasi altra stampante.
Questo approccio ha funzionato per me su un sistema POS che ho sviluppato.