Python操作Star TSP100 USB热敏打印机写入数据报错排查
python-escpos连接Star TSP100打印机报错排查方案
报错核心由三个常见问题叠加导致:打印机仿真模式不兼容、Windows下USB驱动被独占、默认USB端点参数不匹配,按以下顺序排查即可解决:
1. 先切换打印机到ESC/POS兼容模式
Star TSP100出厂默认用私有Star指令集,完全不兼容ESC/POS协议,这是最多人踩的坑:
- 关机状态下按住FEED走纸键不放开机,等自检页打印完成后松手,查看自检页上的
Emulation字段 - 如果显示不是ESC/POS,打开TSP100 Configuration Utility配置工具,在打印控制设置项里把仿真模式切换为ESC/POS,保存配置后重启打印机。
2. 解决libusb访问设备被占用的问题
报错里的libusb0-dll:err [os_open] failed to open是典型的驱动冲突:
- Star原厂USB打印驱动会独占设备端口,导致pyusb依赖的libusb无法获取设备访问权限
- 解决步骤:
- 打开设备管理器,在通用串行总线设备分类下找到Star TSP100
- 右键选更新驱动程序→浏览本地查找驱动→从可用驱动列表选择,将驱动替换为libusb-win32(没有对应驱动的话用zadig工具,选中TSP100设备后直接替换为libusb-win32驱动即可)
- 注意:替换为libusb驱动后,系统自带的打印队列将无法直接访问该打印机,仅能通过pyusb/python-escpos调用。
3. 修正USB连接参数,解决KeyError: 1报错
初始化Usb对象时仅传VID/PID会使用默认端点地址0x01,和TSP100实际端点不匹配就会触发该错误:
- 先运行以下代码查询设备实际的接口号、端点地址:
import usb.core import usb.util dev = usb.core.find(idVendor=0x0519, idProduct=0x0003) if not dev: raise RuntimeError("未检测到打印机,请检查接线和VID/PID") dev.set_configuration() for cfg in dev: for intf in cfg: print(f"接口编号: {intf.bInterfaceNumber}") for ep in intf: ep_dir = "输入端点" if usb.util.endpoint_direction(ep.bEndpointAddress) == usb.util.ENDPOINT_IN else "输出端点" print(f" {ep_dir}地址: {hex(ep.bEndpointAddress)}")
- 用查询到的实际参数初始化打印机,例如查询到接口号为0、输入端点为0x81、输出端点为0x02时,初始化代码改为:
from escpos.printer import Usb # 参数顺序:VID, PID, 接口号, 输入端点地址, 输出端点地址 p = Usb(0x0519, 0x0003, 0, 0x81, 0x02) p.text("Hello World!\n") p.cut() # 测试走纸切纸
其他注意事项
- 运行脚本前清空所有待打印任务,关闭Star配置工具等可能占用打印机的程序
- 仍报权限错误时,用管理员权限启动终端/PyCharm再运行脚本
- USB模式调试不通的话,优先换用网口/串口连接TSP100,兼容性比USB直连高很多,不需要折腾驱动替换。
内容的提问来源于stack exchange,提问作者Life of Madness
相关产品推荐
相关产品推荐

