iT邦幫忙

0

[ C# winform ] USB Printer 使用 ESC POS 指令要怎麼取得 response ?

如題 ..

我是用 https://github.com/mtmsuhail/ESC-POS-USB-NET 裡面的 RawPrinterHelper.cs 部份程式碼來呼叫 WritePrinter 發送指令。

部份程式碼

[DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, int dwCount, out int dwWritten);

但我不知道要怎麼接收 Orz
winspool.Drv 有提供一個 ReadPrinter 的方法,但找了一天沒見到有任何範例程式碼成功使用這個方法, stackoverflow 上面還是掛著這個問題,發問者也在其他很多地方問過都沒解答

假設不管上面這個方式,有其他方法可以對這種 USB POS Printer 收送指令嗎?

要收的資訊是票紙殘量警告,發送 "DLE EOT 4" 就會拿到回應…但不知道怎麼拿 T_T 很神奇的是這個功能應該蠻必要的,出單機快沒紙應該要通知不是嗎 .. 卻找不到答案

/images/emoticon/emoticon02.gif


最後解決方案就是用序列通訊去問,只是要先改印表機佇列的通訊埠

修改印表機佇列通訊埠的程式碼參考範例如下

 static public void SetPrinterPort(string printerName, string portName)
        {
            var oManagementScope = new ManagementScope(ManagementPath.DefaultPath);
            oManagementScope.Connect();

            SelectQuery oSelectQuery = new SelectQuery();
            oSelectQuery.QueryString = @"SELECT * FROM Win32_Printer 
            WHERE Name = '" + printerName.Replace("\\", "\\\\") + "'";

            ManagementObjectSearcher oObjectSearcher =
               new ManagementObjectSearcher(oManagementScope, @oSelectQuery);
            ManagementObjectCollection oObjectCollection = oObjectSearcher.Get();
            
            foreach (ManagementObject oItem in oObjectCollection)
            {
                Console.WriteLine("oItem[Name]: " + oItem.Properties["Name"].Value.ToString());
                Console.WriteLine("oItem[PortName]: " + oItem.Properties["PortName"].Value.ToString());                
                oItem.SetPropertyValue("PortName", portName + ":");
                oItem.Put();
            }
        }
自問自答,首先 winspool.Drv 裡面的 ReadPrinter 我依然找不到解決方案。 然後如果今天是用 ESC/POS 指令來繪製及列印票據的話,你應該不會遇到這個問題。

如果是用 c# 裡面的 PrintDocument 類別來印發票,可能就會遇到跟我一樣的問題。

總結來說就是印表機佇列會佔用序列埠,所以我要去問印表機的狀態時會先把印表機佇列的連接埠改掉。然後就是用一般序列通訊的方式去問狀態拿回應,之後再把印表機佇列的連接埠改回去。

尚未有邦友回答

立即登入回答