Linux系统和USB热敏打印机通信 - xiaohao0576/odoo-doc GitHub Wiki

背景知识

Linux系统插入USB接口的热敏打印机后,系统一般会生成/dev/usb/lp0文件,使用程序向这个文件写入数据(可以是二进制数据),打印机就会开始工作。然而,/dev/usb/lp0这个文件名可能并不是完全固定的,如果设备上插入了多个USB接口的打印机,可能会生成lp1, lp2 ,lp3这样的文件名,所以,我们需要udev方案。

使用Udev固定设备文件名

  1. 在 /etc/udev/rules.d/ 目录下创建一个新文件,例如 99-my-thermal-printer.rules。使用高编号(如 99)确保您的规则在大多数默认规则之后运行。

  2. 编写规则内容 SUBSYSTEM=="usb", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="my_thermal_printer", GROUP="lp", MODE="0666" 记得将 xxxx 和 yyyy 替换为您打印机的实际 vendor ID 和 product ID。Linux下可以用lsusb命令查看VID和PID

  3. 保存文件并更新 udev 规则

sudo udevadm control --reload-rules
sudo udevadm trigger

这样设置后: /dev/usb/lp0 将继续由系统默认规则创建。 /dev/my_thermal_printer 将作为一个指向同一设备的新符号链接创建。

多台相同型号的打印机处理规则

如果有多台相同型号的打印机插入Linux主机,可以使用设备的SN号进行区分

SUBSYSTEM=="usb", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", ATTRS{serial}=="ABC123", SYMLINK+="my_printer_ABC123"

udev还支持根据USB设备的SN号进行动态命名

SUBSYSTEM=="usb", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="my_printer_$attr{serial}"