7

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

4

4 回答 4

6

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

于 2009-03-04T01:46:26.097 回答
3

如果打印机将自己注册为人机接口设备,您可以P/INVOKE 进入适当的 Win32 API。以下是签名:

    [ 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 );
于 2008-10-09T14:25:09.467 回答
1

icsharpcode 的人在这里有一个 Win32 USP api 的 C# 包装器,我在 .Net 中至少看到了另一个对 USB 东西的引用。

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

于 2008-10-09T14:26:54.363 回答
1

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

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

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

于 2008-10-09T16:12:09.953 回答