Python 如何解决;控制消息失败,win错误:指定了不存在的设备";PyUSB错误

Python 如何解决;控制消息失败,win错误:指定了不存在的设备";PyUSB错误,python,error-handling,pyusb,Python,Error Handling,Pyusb,我正在尝试将POS收据打印机连接到python,并且一直在使用python escpos。我正在运行windows 10 我的文件“print.py”中的代码是: 从escpos.printer导入Usb p=Usb(0x0456,0x0808) p、 文本('Hello World\n') 但当我运行它时,我会得到以下错误日志: Traceback (most recent call last): File "C:\Users\Harry\AppData\Local\Programs\P

我正在尝试将POS收据打印机连接到python,并且一直在使用python escpos。我正在运行windows 10

我的文件“print.py”中的代码是:

从escpos.printer导入Usb
p=Usb(0x0456,0x0808)
p、 文本('Hello World\n')
但当我运行它时,我会得到以下错误日志:

Traceback (most recent call last):
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\usb\core.py", line 223, in get_interface_and_endpoint
    return self._ep_info[endpoint_address]
KeyError: 1
在处理上述异常期间,发生了另一个异常:

Traceback (most recent call last):
  File "print.py", line 5, in <module>
    p.text('Hello World\n')
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\escpos\escpos.py", line 437, in text
    self._raw(txt.encode())
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\escpos\printer.py", line 73, in _raw
    self.device.write(self.out_ep, msg, self.timeout)
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\usb\core.py", line 940, in write
    intf, ep = self._ctx.setup_request(self, endpoint)
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\usb\core.py", line 102, in wrapper
    return f(self, *args, **kwargs)
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\usb\core.py", line 215, in setup_request
    intf, ep = self.get_interface_and_endpoint(device, endpoint_address)
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\usb\core.py", line 102, in wrapper
    return f(self, *args, **kwargs)
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\usb\core.py", line 225, in get_interface_and_endpoint
    for intf in self.get_active_configuration(device):
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\usb\core.py", line 102, in wrapper
    return f(self, *args, **kwargs)
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\usb\core.py", line 239, in get_active_configuration
    bConfigurationValue=self.backend.get_configuration(self.handle)
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\usb\backend\libusb0.py", line 510, in get_configuration
    100)
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\usb\backend\libusb0.py", line 593, in ctrl_transfer
    timeout
  File "C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\usb\backend\libusb0.py", line 431, in _check
    raise USBError(errmsg, ret)
usb.core.USBError: [Errno None] b'libusb0-dll:err [control_msg] sending control message failed, win error: A device which does not exist was specified.\r\n\n'
回溯(最近一次呼叫最后一次):
文件“print.py”,第5行,在
p、 文本('Hello World\n')
文件“C:\Users\Harry\AppData\Local\Programs\Python36-32\lib\site packages\escpos\escpos.py”,第437行,文本
self._raw(txt.encode())
文件“C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site packages\escpos\printer.py”,第73行,原始格式
self.device.write(self.out\u ep、msg、self.timeout)
文件“C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site packages\usb\core.py”,第940行,已写入
intf,ep=self.\u ctx.setup\u请求(self,endpoint)
文件“C:\Users\Harry\AppData\Local\Programs\Python36-32\lib\site packages\usb\core.py”,第102行,在包装器中
返回f(自,*args,**kwargs)
文件“C:\Users\Harry\AppData\Local\Programs\Python36-32\lib\site packages\usb\core.py”,第215行,在安装请求中
intf,ep=self.get_接口_和_端点(设备、端点_地址)
文件“C:\Users\Harry\AppData\Local\Programs\Python36-32\lib\site packages\usb\core.py”,第102行,在包装器中
返回f(自,*args,**kwargs)
文件“C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site packages\usb\core.py”,第225行,位于get_接口_和_端点中
对于在self.get\u active\u配置(设备)中的intf:
文件“C:\Users\Harry\AppData\Local\Programs\Python36-32\lib\site packages\usb\core.py”,第102行,在包装器中
返回f(自,*args,**kwargs)
文件“C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site packages\usb\core.py”,第239行,处于get\u active\u配置中
bConfigurationValue=self.backend.get\u配置(self.handle)
get\U配置中的文件“C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site packages\usb\backend\libusb0.py”,第510行
100)
文件“C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site packages\usb\backend\libusb0.py”,第593行,在ctrl\U传输中
超时
文件“C:\Users\Harry\AppData\Local\Programs\Python\Python36-32\lib\site packages\usb\backend\libusb0.py”,第431行,在检查中
升起USBError(errmsg,ret)
usb.core.USBError:[Errno None]b'libusb0-dll:err[control\u msg]发送控制消息失败,win错误:指定了不存在的设备。\r\n\n
有人知道我需要做什么才能让这一切顺利吗。 我已将libusb安装到System32和SysWOW64文件夹中,并使用zadig为打印机安装libusb-32驱动程序

我正在使用的打印机是“Hoin 58mm POS打印机”


如果有人能向我解释为什么我会有这个错误以及如何解决它,我将不胜感激

首先,您可以检查完整的线程

正如

在Windows 7机器上尝试遵循教程时,我遇到了相同的
无后端可用
异常。根据其中一份答复,以下内容对我有效:


我已经在Windows-10 64位版本上验证了上述答案,我至少使用了3种不同的USB存储设备对该错误有过严格的经验。经过数小时的试验,我最终感觉到USB传输错误是导致这一错误的原因

USB总线将以随机模式返回低质量连接,就像设备移除可能发生了

在我的场景中,我正在向
\\.\PhysicalDriveN
设备批量写入扇区,我注意到在短时间后,连接重新建立,文件句柄仍然有效并运行

为了克服这个错误,我完成了以下步骤:

  • 寻求文件的位置
  • 写入扇区
  • 对于任何433错误:
    • 250毫秒延迟
    • 寻求文件位置,忽略错误\u无\u此类设备错误\u未准备好错误,并尝试至少1000毫秒后放弃
    • 读取扇区,忽略错误\u无\u此类设备错误\u未准备好错误,并在放弃之前重试1000毫秒
    • 特别针对我的场景:我比较了输入缓冲区和读取缓冲区,如果匹配就停止
    • 重复整个过程最多5次

因此,这里的想法如下:设备驱动程序返回ERROR\u NO\u这样的\u device假设设备删除场景,但仍处于挂起状态。由于问题仅仅是物理连接的质量问题,链路将继续,总线驱动程序将开始重新协商,在这种情况下,将临时返回一个错误\u NOT \u READY。当链接稳定并协商后,通信将继续进行,而无需重新打开设备句柄。

我建议在USB打印机实例化和尝试打印之间添加一两秒钟的休眠语句。e、 g:

from escpos.printer import Usb
from time import sleep

p = Usb(0x0456,0x0808)

sleep(1)

p.text('Hello World\n')

这与ESC/POSMarc无关,我认为它与ESC/POS无关如果我认为它与PyUSB有关,你知道我需要做什么来解决它吗?不幸的是,我现在不知道你正在使用的库。我将原始ESC/POS命令序列发送到打印机。
from escpos.printer import Usb
from time import sleep

p = Usb(0x0456,0x0808)

sleep(1)

p.text('Hello World\n')