将 text() 与 python-escpos 一起使用时,我得到 [Errno None] 和 key error = 1 (windows 10)

When using text() with python-escpos I get [Errno None] and key error = 1 (windows 10)

我正在尝试使用 TM-T20II 热敏打印机打印收据。这是我的代码:

from escpos import printer
from escpos import *
import escpos
from escpos import config
import usb.core
import usb.util
import usb.backend.libusb1
from ctypes import c_void_p, c_int

backend = usb.backend.libusb1.get_backend(find_library=lambda x: "libusb-1.0.dll")
backend.lib.libusb_set_option.argtypes = [c_void_p, c_int]
backend.lib.libusb_set_option(backend.ctx, 1)
p = printer.Usb(0x04b8,0x0e15,0,0x82,0x01, backend=backend)

p.text('test')

我正在使用 usbdk 后端,如果没有它,我会得到一个 'NotImplementedError: Operation not supported or unimplemented on this platform.' 我这样做是因为要让我的程序正常工作,我需要使用默认的 Epson 驱动程序。当我 运行 此代码时,我得到的错误是:

<File "C:\Users\maxsl\anaconda3\lib\site-packages\usb\core.py", line 234, in get_interface_and_endpoint return self._ep_info[endpoint_address]

KeyError: 1

During handling of the above exception, another exception occurred:

File "C:\Users\maxsl\anaconda3\lib\site-packages\usb\backend\libusb1.py", line 604, in _check raise USBError(_strerror(ret), ret, _libusb_errno[ret])

USBError: [Errno None] Other error>

这个错误只有在我添加p.text()的时候才会出现。找到打印机,其他都没有问题。我还想说 write() 在 PyUSB 模块中工作,但不必将程序中的输出翻译成令人困惑的 ESC/P 语言对我来说会方便得多。

我将 Spyder 4 与 anaconda (python 3.7) 64 位、libusb 1.0.22b9、github 上的最新 pyusb 一起使用(PyPi 版本出现未实现的错误),以及 python-escpos 3.0a8。我相信它们也都是 64 位的。我的 System32 中有 64x 文件夹中的 libusb1.dll,SysWoW64 中有推荐的 86x 文件夹。我也安装了 Usbdk。如果您有任何要解决的想法或需要更多详细信息,请告诉我。在谷歌上搜索了一个星期。

不会是打印机的USB模式设置有问题吗?
TM-T20II打印机有USB厂商定义class(COM口)和USB打印机class.
模式 VID/PID 分别是 USB 供应商定义的 class=0x04b8:0x0202 和 USB 打印机 class=0x04b8:0x0e15。

TM-T20II Technical Reference Guide 第 89 页

您应该可以使用打印机的设置实用程序进行更改。
或者,尝试将 PID 指定原样更改为 0x0202,或者尝试作为 COM 端口而不是原始 USB 设备进行通信。


或者高级打印机驱动程序或Windows后台打印程序可能已经在使用该设备,其他程序无法使用。
如果安装了设备驱动程序,请尝试卸载它。

对于和我有同样问题的其他人,我所做的是安装 Epson 的 TM 虚拟端口驱动程序并将打印机设置为 COM 端口。然后我不得不进入打印机的设置并手动将端口更改为虚拟端口。然后我将代码更改为:

from escpos import printer



pr = printer.Serial('COM2')


data= '''
hello world
'''

pr.text(data)
pr.close()

终于成功了!你可以看到我削减了我的代码很多。事实证明我什至不需要更改后端。如此奇怪的 USB 不起作用,但串口可以。只要它有效!感谢 kunif 对我的解决方案的指导,甚至从未考虑过检查串行端口。