1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java和打印机通信 通过Windows驱动程序与热敏打印机进行双向通信

java和打印机通信 通过Windows驱动程序与热敏打印机进行双向通信

时间:2024-09-11 18:30:06

相关推荐

java和打印机通信 通过Windows驱动程序与热敏打印机进行双向通信

我需要开发一个应用程序来打印热敏打印机,如Epson ESC / POS协议或ZPL Zebra协议 . 我可以使用网络打印机,串口打印机以及窗口的假脱机打印机将原始代码写入打印机 . 当我需要“查询”prnter以获取其状态(准备,错误,纸张结束等)时,我的麻烦开始了,在这种情况下我需要反向通信,我发送一个特殊命令,打印机回答一些状态字节 . 一切都很清楚......使用网络/插座打印机或串口打印机......用Windows打印机我无法理解如何读取打印机状态...

有什么解决方案吗?

UPDATE

按照Hans的建议,我正在尝试使用Windows API读取打印机 . 这是我用ESC / POS协议测试的 .

public class WinPrinter

{

// Structure and API declarions:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

public class DOCINFOA

{

[MarshalAs(UnmanagedType.LPStr)]

public string pDocName;

[MarshalAs(UnmanagedType.LPStr)]

public string pOutputFile;

[MarshalAs(UnmanagedType.LPStr)]

public string pDataType;

}

[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);

[DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

public static extern bool ClosePrinter(IntPtr hPrinter);

[DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);

[DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

public static extern bool EndDocPrinter(IntPtr hPrinter);

[DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

public static extern bool StartPagePrinter(IntPtr hPrinter);

[DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

public static extern bool EndPagePrinter(IntPtr hPrinter);

[DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

[DllImport("winspool.Drv", EntryPoint = "ReadPrinter", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]

public static extern bool ReadPrinter(IntPtr hPrinter, [MarshalAs(UnmanagedType.LPStr)] StringBuilder pBytes, Int32 dwCount, out Int32 dwNReadBytes);

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

}

string reaDstrinG = "";

Int32 buf = 0;

Int32 pcRead;

System.Text.StringBuilder sb = new System.Text.StringBuilder();

bool read = ReadPrinter(hPrinter, sb.Append(reaDstrinG), buf, out pcRead);

ClosePrinter(hPrinter);

}

// If you did not succeed, GetLastError may give more information

// about why not.

if (bSuccess == false)

{

dwError = Marshal.GetLastWin32Error();

}

return bSuccess;

}

static void Main(string[] args)

{

String test = "\u0010\u0004\u0001";

IntPtr pBytes=Marshal.StringToCoTaskMemAnsi(test);

Int32 dwCount = test.Length;

WinPrinter.SendBytesToPrinter("BIXOLON SRP-350 (Copia 1)",pBytes,dwCount);

}

}

我确信“\ u0010 \ u0004 \ u0001”(DLE EOT 1)是在ESCPOS协议中请求打印机状态的推荐,我用串行连接的同一台打印机测试它,我得到一个状态字节 .

但是使用上面的代码,我总是从ReadPrinter方法得到错误 . 我检查了打印机端口是否启用了“双向”选项,我也尝试过没有假脱机程序选项 .

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。