为什么这件事要先判断、再买卡
产线上还在跑的并口设备,通常是老式针式打印机、标签打标机、老款测试仪器或早期数控系统的通信口。主机换代时,这些设备往往还能用,问题出在主机这一端:新工控机基本不再提供板载并口。于是现场常见的做法是买一块“转并口”的卡或线,插上试。试不通再换一个型号,几次下来时间和成本都花掉了。
多数失败并不是卡坏了,而是路由选错了层次:设备需要的是寄存器级的并口访问或 EPP/ECP 的反向通道,而买来的方案只提供单向打印通道。这篇文章给出一套判断顺序,先把手上的设备归类,再决定走哪条路线,最后给出可以在采购前就跑完的验证清单。
第一步:确认设备用的是哪一种“并口”
IEEE 1284 定义的并不只是一个 25 针接口,而是五种工作模式。设备真正依赖的是其中某一种模式的握手方式与数据方向,这一点决定了后面所有选择。
| 模式 | 数据方向 | 速率量级 | 典型用途 |
|---|---|---|---|
| Compatibility(SPP) | 单向,主机到设备 | 几十至数百 KB/s | 传统针式/票据打印机 |
| Nibble | 反向 4 位 | 低 | 打印机状态回读、模式协商的起点 |
| Byte(反向) | 反向,8 位并行(设备到主机) | 中等 | 早期扫描仪、需要读回数据的设备 |
| EPP | 半双工,8 位双向 | 最高约 2 MB/s | 扫描仪、存储设备、采集类外设 |
| ECP | 半双工,8 位双向 | 最高约 2.5 MB/s | 需要 DMA 与压缩的高速外设 |
几个关键事实需要先建立:IEEE 1284 各模式的实际速率上限大致为 EPP 约 2 MB/s、ECP 约 2.5 MB/s,系统整体吞吐通常按 2.5 MB/s 量级描述,实际往往更低;EPP 由 Intel、Xircom、Zenith 在 1991 年提出,把普通并口的速率提高了约一个数量级;ECP 由 HP 与 Microsoft 随后提出,在 x86 平台上传统上依靠 ISA 风格的 DMA(常见为通道 3)搬运数据,并支持行程编码压缩。所有模式都使用 TTL 电平,这是并口电缆长度通常只能做到数米的根本原因;线材的屏蔽、电容与走线同样影响可用长度。
还要注意一点:按 IEEE 1284 的描述,双向通信需先通过 Nibble 模式完成协商。主机收不到回应,就按传统打印机处理,退回 Compatibility 模式;收到回应后,双方再协商出共同支持的最快模式。这条规则解释了大量“新卡带老设备不工作”的现象——老设备可能根本不参与协商。
第二步:软件是怎么访问并口的(真正的分水岭)
模式只是第一层,真正决定路线的是上位软件访问并口的深度。按侵入程度从深到浅排列:
- 直接端口 I/O:程序里出现
0x378这类固定地址,或用inp/outp、inportb/outportb一类的调用直接读写数据、状态、控制三个寄存器。这种软件要求主机端存在地址兼容的真实并口寄存器,任何“看起来像打印机”的转接方案都不满足。 - LPT 驱动 + 模式控制:通过操作系统的并口设备节点或驱动接口访问,允许指定 SPP/EPP/ECP 模式。这类软件需要驱动把模式设置真正下发到控制器。
- 打印子系统:只把字节流交给打印机队列,不关心寄存器与时序。这类软件对底层是板载并口、扩展卡还是 USB 转接线最不敏感。
- 厂商自带驱动或 DLL:设备厂商提供中间层,底层由它自己适配。此时要问的是“这个驱动支持哪些主机接口”,而不是并口本身。
判断方法很直接:找到上位软件的安装目录,检查是否出现固定端口地址、inpout32/dlportio 之类的端口访问库,或文档里是否要求“设置 LPT 端口地址”。出现任一项,就应当按第 1 类处理,路线选择空间会立刻收窄。
第三步:三条路线的能力边界
路线一:板载并口
这是兼容性最好的方案:并口由主板上的超级 I/O(Super I/O)芯片提供,传统 I/O 地址与 IRQ、DMA 资源由 BIOS 分配,BIOS 里通常还能选择 SPP、EPP、ECP/EPP 自动。但近十年的商用与工控主板大多已经取消了板载并口,只在部分带超级 I/O 芯片的工业主板上保留。如果现役机型还有,优先用它,可以省掉整轮验证。
路线二:PCIe 转并口卡
由桥接芯片在 PCIe 与传统并口之间做转换,向系统暴露并口寄存器与中断资源。Linux 的 parport_pc 就负责这类 PCI 并口卡,I/O 基地址由系统自动探测,不需要手工指定。这类卡的强项是寄存器级访问、可设置 EPP/ECP 模式、时序由本地总线保证,适合直接端口 I/O 的存量软件和需要反通道的设备。代价是占用一个插槽、需要对应操作系统的驱动,并且在 UEFI 平台上要确认传统 I/O 资源确实分配给了这张卡。
路线三:USB 转并口
这类产品大多以 USB 打印机类设备的形式工作,在系统里表现为一个字符打印机或 /dev/usblp 设备。常见型号只实现 IEEE 1284 的单向兼容模式,也就是说:只往设备写数据可以,反向通道、EPP、ECP 基本没有。少数芯片(例如 USS720 一类)提供寄存器模式,能暴露 PCSPP、TRISTATE、COMPAT、EPP、ECP 等模式位,但仿真速度慢,时序敏感的应用仍可能失败。结论很清楚:USB 转并口适合纯打印场景,不适合需要寄存器访问、反通道或严格时序的设备。
| 能力项 | 板载并口 | PCIe 转并口卡 | USB 转并口 |
|---|---|---|---|
| 寄存器级访问(固定端口地址) | 支持 | 支持 | 一般不提供 |
| Nibble/Byte 反向通道 | 支持 | 支持 | 取决于芯片,常见型号不支持 |
| EPP / ECP 模式 | BIOS 可选 | 芯片与驱动支持 | 少数寄存器模式芯片支持,速度受限 |
| ECP 的 DMA 搬运 | 需要 DMA 通道 | 取决于桥接芯片实现 | 不适用 |
| 时序确定性 | 高 | 高 | 低(受 USB 调度影响) |
| 驱动与系统适配 | 系统自带 | Linux 常由 parport_pc 支持,Windows 视卡而定 | 多数系统自带打印机类驱动;部分工业型号为厂商私有类 |
| 占用资源 | — | 一个插槽 + I/O 资源 | 一个 USB 口 |
第四步:把场景落到路线上
把前两步的结论组合起来,现场常见的几种情形基本可以直接定路线:
- 只打印票据或标签,软件走打印驱动:三条路线都能用。优先 USB 转并口,省插槽;需要长时间连续打印、担心 USB 调度抖动的,选 PCIe 卡。
- 软件直接读写 0x378 之类的固定地址:只能用 PCIe 转并口卡(或板载并口)。要注意并非所有 PCIe 并口卡都会被分配到 0x378,需确认卡支持传统地址解码、或软件允许修改基址;选定后在系统里确认 I/O 资源已分配、地址与软件配置一致。
- 设备是扫描仪、老式存储或需要读回数据:按 EPP/Byte 处理,选 PCIe 卡,并实测反向通道能否正常读取。
- 设备使用 ECP 且依赖 DMA 吞吐:选 PCIe 卡,同时确认桥接芯片与驱动是否真正实现了 ECP 的 DMA 路径;只标注“支持 ECP”不等于 DMA 可用。
- 一台主机挂多台并口设备:IEEE 1284.3 定义了菊花链方式,最多可接 8 台,但要求设备与主机都支持该扩展,实际项目里更常见的做法是插多口卡或分主机。
- 多功能外设走 1284.4 逻辑通道:这类设备依赖 IEEE 1284.4 的多路数据交付能力,需要驱动明确支持,选型前应向设备厂商确认,而不是自行推断。
第五步:采购前的验证清单
以下五项可以在正式采购或批量改造前完成,成本很低,能挡掉大部分返工:
- 查模式位:Linux 下查看
/proc/sys/dev/parport/parport0/modes,会列出 PCSPP、TRISTATE、COMPAT、EPP、ECP 等模式位,以及 DMA 能力位(DMA 是资源能力,不属于 IEEE 1284 的工作模式);同一目录下的base-addr、irq、dma文件分别给出地址、中断与 DMA 资源。没有列出的能力,驱动不会去用。 - 确认中断资源:按内核文档说明,parport 当前实现只有在端口有可用 IRQ 时才会启用 COMPAT 与 ECP 的硬件加速;没有 IRQ 时仍能以轮询方式工作,但高速传输会明显变慢,ECP 的 DMA 加速还需要可用的 DMA 通道。
- 确认 ECP 的 DMA 通道:需要走 DMA 时,BIOS 要把并口设为 ECP 并记下 DMA 通道,驱动侧也要按该通道加载(例如
dma=3);两者不一致时,实际退化为 PIO。 - 实测反向通道:用一个会读回状态或数据的设备跑一次完整流程,而不是只打印一页测试页。打印正常但读回失败,说明反向模式没有协商成功。
- 按最坏情况算时序:连续传输几十分钟,观察是否出现丢字符、重复行或设备报错;并口是 TTL 电平,电缆长度以米计,长线与强干扰环境要单独评估屏蔽与走线。
常见误判
- “USB 转并口能替代并口卡”:只在纯打印场景成立。设备一旦需要寄存器访问或反向通道,这条路线基本走不通。
- “BIOS 里设成 EPP/ECP 自动就行”:不支持 1284 协商的老设备可能无法进入双向模式,需要把控制器强制到更基础的模式再试。
- “端口地址随便配”:传统 I/O 地址、IRQ 与 DMA 都是共享资源,与其它 legacy 设备冲突时表现为时通时不通,而不是直接报错。
- “按标称上限估产能”:EPP 约 2 MB/s、ECP 约 2.5 MB/s 是模式上限,实际吞吐受设备机械结构与处理能力制约,通常更低,不能用上限直接推算节拍。
写在最后
并口改造的难点不在接口本身,而在“设备的模式要求 + 软件的访问深度”这两个变量的组合。先把这两项确认清楚,三条路线的取舍就变成了查表;反过来,先买卡再试,等于把这两个未知量交给运气。文中给出的速率与模式值取自 IEEE 1284 标准的技术资料与操作系统驱动文档,具体设备的实现细节仍应以设备手册和芯片数据手册为准。