我需要开发一个应用程序来打印热敏打印机,如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方法得到错误 . 我检查了打印机端口是否启用了“双向”选项,我也尝试过没有假脱机程序选项 .

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

  1. Java实现串口通信的小样例

    用Java实现串口通信(windows系统下),须要用到sun提供的串口包 javacomm20-win32.zip.当中要用到三个文件,配置例如以下: 1.comm.jar放置到 JAVA_HOME ...

  2. Java实现串口通信的小例子

    用Java实现串口通信(windows系统下),需要用到sun提供的串口包 javacomm20-win32.zip.其中要用到三个文件,配置如下: 1.comm.jar放置到 JAVA_HOME/j ...

  3. java驱动打印机_本地打印机驱动程序如何找到网络打印机?

    (我已经在谷歌搜索了几天 . 没有运气 . 商业秘密?) 我有一台自带打印机的笔记本电脑(佳能MF4500w系列) . 笔记本电脑通过空气与打印机通信 . 打印机本身直接连接到路由器,打印机不使用静态 ...

  4. firefox驱动_零适配 + 全兼容!龙芯电脑推出办公外设利旧通用解决方案:运行原生 Windows 驱动程序...

    龙芯中科宣布推出创新的办公外设利旧通用解决方案,采用跨指令兼容的二进制翻译(Binary Translation)技术,在龙芯电脑上运行原生的 Windows 驱动程序,具有 "零适配.全兼 ...

  5. Windows驱动程序的分类

    有两类Windows驱动程序: 用户态驱动程序 运行在用户态,它们经常提供Win32程序.核心态驱动(或其它系统组件)之间的接口.比如打印机驱动就是由用户态和核心态驱动组成的. 核心态驱动程序 运行在 ...

  6. 在WEBSTART中实现串口通信(WINDOWS版)

    在WEBSTART中实现串口通信(WINDOWS版) 看到这个题目,你是不是问:这跟在JAVA中实现串口通信有什么区别?在JAVA中能做在WEBSTART中不就 一样吗? 真聪明,的确是这样的,但事实 ...

  7. windows驱动程序编写_如何在Windows中回滚驱动程序

    windows驱动程序编写 Updating a driver on your PC doesn't always work out well. Sometimes, they introduce b ...

  8. win10找不到打印机_新版Windows 10的外设Bug:重启后找不到USB打印机端口

    微软近日警告,运行Windows 10版本1903或更高版本的设备的客户如果在关闭计算机时断开打印机的连接,将无法使用USB打印机端口. 再次启动Windows 10设备后,USB打印机端口将从打印机 ...

  9. Windows驱动程序分类

    简介   驱动程序最熟知的便是即插即用设备驱动程序,诸如串口.网口.显示器接口的驱动程序.然而,这仅是其中一类.本文是对Windows驱动程序分类进行梳理,实质上所有的操作系统驱动都具有相通性. 正文 ...

最新文章

  1. python3 socket send sendall 区别
  2. Objective-C学习笔记_命令行参数获取
  3. MyEclipse使用总结——修改MyEclipse默认的Servlet和jsp代码模板
  4. CentOS 6.0 X86_64 下 vsftp 配置过程
  5. Nginx缓存的配置调优,Tengine安装和配置。
  6. Ubuntu下的Linux内核的编译及安装
  7. ug许可服务器在那个文件里,ug许可证位置在哪_ug许可证文件在哪的图文步骤
  8. Java描述 数据结构与算法
  9. cad线性标注命令_CAD的标注命令原来可以这样用,学了十几年,终于知道了
  10. 学习vue 20天,我写了点东西
  11. 计算机网络复习题大全(各种题型)
  12. mysql索引的创建和删除吗_MySQL索引的创建、删除和查看
  13. 被错误理解的人工神经网络(一)!
  14. windows火车刷票小白秘笈
  15. 禾匠二开系列之兑换码禁用以后启用功能
  16. 安装文本编辑器 Geany
  17. 静态文档,动态文档和活动文档
  18. Ubuntu18.04打开关闭DNS服务
  19. 关于C++ 虚函数 子类和父类 一点小的总结
  20. html ul实现手机页面,手机端网页banner实现

热门文章

  1. 自定义圆环progressbar
  2. 关于中值滤波算法,以及C语言实现(转)
  3. p3p-header解决跨域访问cookie
  4. HTML学习笔记之二(回到顶部 与 回到底部)
  5. smarty模板引擎_6-Smarty的内置函数
  6. android 在xml文件中引用自定义View
  7. 使用Lex和Yacc开发C语言的编译器
  8. golang中的strings.SplitN
  9. IntelliJ IDEA mac快捷键
  10. mybaits三:全局配置文件