C#开发Win10桌面应用如何模拟打印机捕获谷物分析仪打印数据
问题根因
你遇到的No Printer Found报错核心原因非常明确:这款谷物分析仪的USB输出口不是通用USB主机接口,仅适配你手里那根原配USB转RS232线缆内置的转换芯片,它不会识别普通直连的电脑USB口,也不会识别其他非原配芯片的转接头。设备上电后只会通过原配线缆向RS232侧发送打印机探测握手信号,收不到符合预期的应答就直接抛出找不到打印机的错误。
落地方案
不要尝试开发USB设备模拟驱动,这类方案需要写内核态代码、做Windows驱动签名,适配成本极高。直接复用你手里能正常工作的原配线缆,在RS232层模拟打印机应答即可,链路和直连原打印机完全一致,设备100%能识别:
- 硬件连接:保持原配线缆的USB头插在谷物分析仪上,线缆另一端的DB25 RS232接头,搭配一个RS232交叉型DB25转DB9转接头,再接一个普通USB转RS232模块插到运行自研程序的Win10电脑上即可。注意必须用交叉接线的转接头,保证RS232的TX/RX引脚交叉对接,直连转接头无法正常收发信号。
- 软件逻辑:在C#程序中打开USB转RS232模块对应的系统COM口,监听设备发来的探测信号,返回和真实打印机一致的就绪应答,设备就会正常发送打印数据流,你直接读取串口数据就能拿到完整的打印内容。
C# 核心实现代码
直接用.NET自带的System.IO.Ports.SerialPort类即可实现,不需要依赖任何第三方库:
using System.IO.Ports; using System.Text; using System.Threading; // 串口参数必须和原RS232打印机参数完全匹配 // 老式RS232针式打印机默认参数一般为9600波特率、8数据位、1停止位、无校验、无流控 SerialPort emuPrinterPort = new SerialPort( portName: "COM3", // 替换为你电脑上USB转RS232模块实际对应的串口号 baudRate: 9600, parity: Parity.None, dataBits: 8, stopBits: StopBits.One, handshake: Handshake.None ); // 注册接收回调,捕获打印数据 emuPrinterPort.DataReceived += (sender, e) => { byte[] readBuffer = new byte[emuPrinterPort.BytesToRead]; emuPrinterPort.Read(readBuffer, 0, readBuffer.Length); // 老打印机的打印文本一般用GB2312编码,按需调整编码即可 string printRawContent = Encoding.GetEncoding("GB2312").GetString(readBuffer); // 在这里写入你自己的打印数据处理逻辑 }; emuPrinterPort.Open(); // 响应设备的打印机探测握手 // 通用串行打印机探测逻辑为:设备发送0x11(XON)字符探测打印机,就绪的打印机返回0x11应答 // 如果按这个逻辑应答后设备仍报错,可先把线缆接回原打印机,用串口嗅探工具抓一下开机交互的前几个字节,替换应答字节即可 while (emuPrinterPort.IsOpen) { if (emuPrinterPort.BytesToRead > 0) { int receivedByte = emuPrinterPort.ReadByte(); if (receivedByte == 0x11) { emuPrinterPort.Write(new byte[] { 0x11 }, 0, 1); } } Thread.Sleep(10); }
注意:如果调试时遇到握手不匹配的情况,不要随意更换原配转接线,只要抓一下真实打印机的交互报文替换应答字节即可。所有非原配的USB转接线都会被设备直接拒绝,没有调试价值。
内容的提问来源于stack exchange,提问作者TheoDoc2013
相关产品推荐
相关产品推荐

