给热敏打印机转义码

Gebe Thermalprinter Escapecodes

我使用的是 Gebe 热敏打印机 (GeBE-COMPACT Plus GPT-4672),但遇到以下问题:

打印机(与大多数已知的热敏打印机一样)使用一组独特的转义命令来使用其功能。我正在编写一个将打印作业发送到打印机的 .Net 应用程序,它工作正常,但之后,我需要发送一个 Escape 序列来剪切和释放纸张。该公司发布了一个测试应用程序,它接受一个命令并将其发送到打印机。然而,函数本身卡在一个我无法访问也无法使用的 dll 文件中,因为最终目标系统不支持发布的 dll,所以我正在尝试创建一个解决方法。打印机通过 USB 连接。

裁纸指令如下(直译):C<0d>。在 < 和 ESC 之间不添加 space 的情况下将这一行准确地插入到测试程序中,效果很好。我已经使用 MSDN 页面上提供的代码将原始文本发送到打印机。然而,通过我的方法发送这行文本只是让它将这些行打印到纸上,除了 Escape。我试过将序列转换为十六进制,但没有成功。我试过将文本作为二进制数据发送,也没有用。感觉它只看到了 Escape Sign 而忽略了字符串的其余部分。有谁知道如何解决这个问题?在过去的几个小时里,我一直在来回转换,并使用了将近 12 英尺的纸,因为它根本行不通。

编辑:

根据要求,源代码:

切纸按钮的功能:

        private void BCut_Click(object sender, EventArgs e)
    {
        String output = "<ESC>C<0d>";
        RawPrinterHelper.SendStringToPrinter("Gebe_Drucker", output);
    }

调用 sendbytestoprinter 函数的“SendStringToPrinter”函数的代码:

public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
        {
            Int32 dwError = 0, dwWritten = 0;
            IntPtr hPrinter = new IntPtr(0);
            DOCINFOA di = new DOCINFOA();
            bool bSuccess = false; // Assume failure unless you specifically succeed.

            di.pDocName = "My C#.NET RAW Document";
            di.pDataType = "RAW";

            // Open the printer.
            if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
            {
                // Start a document.
                if (StartDocPrinter(hPrinter, 1, di))
                {
                    // Start a page.
                    if (StartPagePrinter(hPrinter))
                    {
                        // Write your bytes.
                        bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                        EndPagePrinter(hPrinter);
                    }
                    EndDocPrinter(hPrinter);
                }
                ClosePrinter(hPrinter);
            }
            // If you did not succeed, GetLastError may give more information
            // about why not.
            if (bSuccess == false)
            {
                dwError = Marshal.GetLastWin32Error();
            }
            return bSuccess;
        }

        public static bool SendStringToPrinter(string szPrinterName, string szString)
        {
            IntPtr pBytes;
            Int32 dwCount;
            // How many characters are in the string?
            dwCount = szString.Length;
            // Assume that the printer is expecting ANSI text, and then convert
            // the string to ANSI text.
            MessageBox.Show(szString);
            pBytes = Marshal.StringToCoTaskMemAnsi(szString);
            // Send the converted ANSI string to the printer.
            SendBytesToPrinter(szPrinterName, pBytes, dwCount);
            Marshal.FreeCoTaskMem(pBytes);
            return true;
        }

就是这样。希望对您有所帮助。

您不能只将“C<0d>”写成字符串 - 和 <0d> 是特殊代码。 < ESC> 用于二进制 27,<0d> 用于二进制 0。您必须构造字符串,例如这样(十六进制编码): 字符串输出 = "\u001BC\u0000";