如何在Linux系统中通过CN36线缆接收HP 200LX掌上电脑的打印数据以排查故障?
首先得说透:你现在用cat /dev/usb/lp1看不到数据是完全正常的——因为usblp驱动是专门给Linux当主机控制打印机设计的,它暴露的/dev/usb/lp*节点只负责让Linux往打印机发数据,反过来从HP 200LX(作为并行口主机)往Linux传数据,这个驱动根本不会把这类反向数据流暴露到/dev节点里。
下面给你几个从易到难的可行方案,一步步帮你抓到打印数据、定位故障:
一、用USB总线抓包工具直接捕获原始流量
这是最快捷的软件方案,绕过usblp的限制,直接监控USB总线上的所有数据包:
加载USB监控模块
Linux内核自带usbmon模块,专门用来抓USB总线流量,先加载它:sudo modprobe usbmon确认目标USB设备的总线信息
从你的dmesg输出看,设备是usb 1-3(总线1,端口3),也可以用lsusb再确认:lsusb | grep "USB Print"找到对应行,比如
Bus 001 Device 007: ID 1a86:7584 QinHeng Electronics USB Print Adapter,记好总线号(这里是1)。开始抓包并触发打印
选一种你顺手的方式:- 用Wireshark格式抓包(推荐,方便后续分析):
执行后立刻在HP 200LX上触发打印命令,等打印操作完成后按sudo tshark -i usbmon1 -w hp_lx_print_capture.pcapCtrl+C停止。之后用Wireshark打开hp_lx_print_capture.pcap,过滤usb.bulk就能看到设备往主机发的IN端点数据包,里面就是原始打印数据。 - 直接捕获文本日志(快速排查):
同样触发打印后停止,打开sudo cat /sys/kernel/debug/usb/usbmon/1u > capture.logcapture.log就能看到有没有数据传输(格式偏粗糙,但足够判断是否有数据流)。
- 用Wireshark格式抓包(推荐,方便后续分析):
小提示
抓包前建议先卸载usblp驱动,避免它占用设备干扰抓包:sudo rmmod usblp
二、用libusb直接读取设备端点数据
如果usbmon抓包太底层,你可以用libusb工具直接和USB设备的IN端点通信,实时读取HP 200LX发来的数据:
安装libusb工具
以Debian/Ubuntu系为例:sudo apt install libusb-1.0-0-dev usbutils找到设备的IN端点
执行以下命令,找到带IN标记的端点地址(比如bEndpointAddress 0x81 EP 1 IN):lsusb -v -d 1a86:7584用usbcat读取端点数据
如果你安装了usbcat工具,执行以下命令(替换0x81为你找到的IN端点地址):sudo usbcat -d 1a86:7584 -i 0x81 -v触发HP 200LX的打印后,就能实时看到输出的打印数据了。
三、硬件监控(最可靠,排除转接器故障)
如果软件方法还是抓不到数据,大概率是转接链的引脚映射有问题,或者HP 200LX本身没发出信号,这时候硬件监控最直接:
- 买一块CN36并行口 breakout板,把HP 200LX出来的CN36接头接到breakout板上;
- 用USB逻辑分析仪(便宜的几十块就能买到)监控并行口的关键信号:数据引脚D0-D7、STROBE(选通信号)、ACK(应答信号);
- 触发打印后观察信号:如果STROBE有脉冲、数据引脚有电平变化,说明HP 200LX在正常发数据,问题出在转接器或Linux驱动;如果没有任何信号变化,那就是HP 200LX的打印端口本身故障。
额外排查小技巧
- 检查转接器方向:CN36公头是打印机接收端,母头是主机发送端。要确保你的8针→CN36转接线是把HP的主机口转成标准Centronics主机输出,且后续的CN36→DB25、DB25→USB转接器都是引脚直通的,不是交叉线;
- 验证HP 200LX本身:如果能找到老式并行口打印机,用原线直接连接,确认HP 200LX是否能正常打印,先排除设备本身的问题。
备注:内容来源于stack exchange,提问作者Neil Svedberg

