2008-10-09 23 views
5

Alguna idea de cómo puedo manejar mejor una impresora POS USB desde C#. Las impresoras POS suelen ser de serie, TCP/IP o basadas en USB. Sé cómo lograr serial y TCP/IP pero no tengo idea acerca de las comunicaciones a través de USB en C#. Sé que hay una capa disponible de Microsoft llamada POS.NET, pero quiero intentar evitar usar esto. Cualquier idea o biblioteca de C# que la gente pueda recomendar sería muy apreciada. GraciasConduzca una impresora POS a través de USB en C#

Respuesta

4

Debería considerar usar POS para .NET y objetos de servicio .NET o OPOS (Epson, por ejemplo, proporciona ambos). POS para .NET cumple con el estándar de la industria UnifiedPOS para interactuar con estos dispositivos.

2

Si la impresora se registra como Dispositivo de interfaz humana, puede P/INVOKE into the appropriate Win32 APIs. Aquí están las firmas:

[ 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); 
+0

Cuando conecta la impresora intenta instalarse y falla porque no hay controladores presentes. Luego aparece en la sección "Otros dispositivos" en el Administrador de dispositivos. – JDibble

1

Hay un envoltorio C# para Win32 USP API s chicos ICSharpCode here, y he visto otra al menos one referencia a la materia USB en .Net.

Lo que puede ser complicado es si la impresora requiere OPOS para funcionar o no. Hice un poco de trabajo en un proyecto POS en .Net hace unos años, y por lo que recuerdo, OPOS es prácticamente el estándar para el lado del hardware de las cosas (y en ese momento todas las API OPOS utilizaban la interoperabilidad COM). Los dispositivos a veces también tienen un protocolo de comunicaciones patentado documentado, en cuyo caso debe poder utilizarlo para hablar con el dispositivo utilizando la biblioteca USB.

1

Si ya ha hecho rodar su propio código de control de la impresora, puede pasar los comandos directamente a la impresora configurando la impresora utilizando el controlador de impresora "Genérico/Texto" en el puerto USB. Ese controlador no volverá a interpretar los códigos de control e intentará imprimirlos, sino que simplemente los entregará a la impresora tal como está.

A continuación, el puerto USB se puede utilizar como cualquier otra impresora.

Este enfoque funcionó para mí en un sistema POS que desarrollé.

Cuestiones relacionadas