在c#中通过USB驱动POS打印机

时间:2008-10-09 14:16:45

标签: c# usb point-of-sale

任何想法如何最好地从c#驱动USB POS打印机。 POS打印机通常是串行,TCP / IP或USB。 我知道如何完成串行和TCP / IP,但不知道在C#中通过USB进行通信。 我知道微软有一个名为POS.NET的图层,但我想尽量避免使用它。 任何想法或人们可以推荐的任何C#库都会非常感激。感谢

4 个答案:

答案 0 :(得分:4)

您应该考虑使用POS for .NET和OPOS或.NET服务对象(例如Epson提供这两者)。 POS for .NET符合UnifiedPOS行业标准,可与这些设备连接。

答案 1 :(得分:2)

如果打印机将自身注册为人机接口设备,则可以P/INVOKE into the appropriate Win32 APIs。以下是签名:

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

答案 2 :(得分:1)

来自icsharpcode的人here有一个来自Win32 USP api的C#包装器,我在.Net中至少看到了one其他对USB内容的引用。

可能棘手的是打印机是否需要OPOS才能运行。几年前我在.Net的一个POS项目上做了一些工作,从我记得OPOS几乎是硬件方面的标准(当时所有OPOS API都使用COM互操作)。这些设备有时也有一个记录在案的专有通信协议,在这种情况下,您应该能够利用它与USB库进行通信。

答案 3 :(得分:1)

如果您已经推出了自己的打印机控制代码,则可以使用USB端口上的“Generic / Text”打印机驱动程序设置打印机,直接将命令传递给打印机。该驱动程序不会重新解释控制代码并尝试打印它们,但它只是将它们按原样交给打印机。

然后可以像使用任何其他打印机一样使用USB端口。

这种方法适用于我开发的POS系统。