2008-10-09 84 views
5

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

回答

4

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

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

当您连接打印机时,它会尝试自行安装,并且由于没有驱动程序而失败。然后它出现在设备管理器的“其他设备”部分。 – JDibble 2008-10-09 15:15:33

1

有针对Win32 API USP的从icsharpcode家伙here一个C#包装,和我见过的.Net至少one其他参考USB的东西。

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

1

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

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

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