2008-10-09 89 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系統。