Pregunta

Alguna idea de cómo puedo manejar mejor una impresora POS USB desde c #. Las impresoras de punto de venta suelen ser de serie, TCP / IP o USB. Sé cómo lograr seriales y TCP / IP, pero no tengo idea 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 cualquier biblioteca de C # que la gente pueda recomendar sería realmente apreciada. Gracias

¿Fue útil?

Solución

Debería considerar usar POS para .NET y OPOS u objetos de servicio .NET (Epson, por ejemplo, proporciona ambos). POS para .NET se ajusta al estándar de la industria UnifiedPOS para la interfaz con estos dispositivos.

Otros consejos

Si la impresora se registra como un dispositivo de interfaz humana, puede P / INVOCAR en las API de Win32 apropiadas . 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 );

Hay un contenedor C # para la API de Win32 USP de los chicos de icsharpcode aquí , y He visto al menos una otra referencia a Material USB en .Net.

Lo que puede ser complicado es si la impresora requiere o no OPOS para funcionar. Trabajé un poco 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 (y en ese momento todas las API de OPOS utilizaban interoperabilidad COM). Los dispositivos a veces también tienen un protocolo de comunicaciones propietario documentado, en cuyo caso debería poder utilizarlo para comunicarse con el dispositivo utilizando la biblioteca USB.

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

Entonces el puerto USB se puede usar como cualquier otra impresora.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top