首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决“控制消息失败,win错误:指定了一个不存在的设备”错误PyUSB

如何解决“控制消息失败,win错误:指定了一个不存在的设备”错误PyUSB
EN

Stack Overflow用户
提问于 2020-03-06 03:55:05
回答 3查看 1.1K关注 0票数 0

我正在尝试将一台POS收据打印机连接到python,并且一直在使用python-escpos来实现。我用的是Windows10。

我在文件'print.py‘中的代码是:

代码语言:javascript
复制
from escpos.printer import Usb

p = Usb(0x0456,0x0808)

p.text('Hello World\n')

但是当我运行它时,我得到了以下错误日志:

代码语言:javascript
复制
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

在处理上述异常的过程中,发生了另一个异常:

代码语言:javascript
复制
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'

有没有人知道我需要做什么才能让它工作。我已经在我的System32和SysWOW64文件夹中安装了libusb,并使用zadig为我的打印机安装了libusb-32驱动程序。

我使用的打印机是'Hoin 58‘m打印机’。

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

EN

回答 3

Stack Overflow用户

发布于 2020-07-25 13:11:59

首先,您可以检查此link中是否有完整的线程。

建议的

当我试图在Windows7机器上遵循教程时,我遇到了同样的No backend available异常。根据其中一条StackOverflow回复,以下方法适用于我:

1.下载最新的Windows二进制文件:https://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.21/libusb-1.0.21.7z/download 2.使用7zip解压到临时目录3.如果是64位Windows,请将MS64\dll\libusb-1.0.dll复制到C:\windows\system32中。如果在32位windows上,请将MS32\dll\libusb-1.0.dll复制到C:\windows\SysWOW64中。

我已经在Windows-10 64位版本的上验证了上述答案。

票数 0
EN

Stack Overflow用户

发布于 2020-12-10 20:12:48

我使用了至少3种不同的USB存储设备,对这个错误有过严格的体验。经过几个小时的试验,我最终感觉到USB传输错误是导致这个错误的原因。

对于低质量连接,USB总线将以随机模式返回它,就好像设备移除可能已经发生一样。

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

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

  • Seek到文件Position;

  • Write扇区;

  • 用于任何433错误:
  • 250 ms延迟;
  • Seek到文件位置,忽略ERROR_NOT_READY
  • 错误,并在放弃之前尝试至少1000 ms;

H118ERROR_NOT_READY >读取扇区,忽略和code错误,并在放弃之前重试最多1000 ms;如果matching;

  • Repeat整个过程高达5 times.

,我已经比较了输入缓冲区和读取缓冲区并停止

所以这里的想法是这样的:设备驱动程序返回ERROR_NO_SUCH_DEVICE,假设设备移除场景,但仍然处于挂起状态。由于问题仅仅是物理连接的质量,因此链路继续,总线驱动程序开始重新协商,在这种情况下,临时返回ERROR_NOT_READY。当链路稳定且经过协商后,通信将继续,而无需重新打开设备句柄。

票数 0
EN

Stack Overflow用户

发布于 2021-01-21 14:01:58

我建议在实例化USB打印机和尝试打印到它之间添加一到两秒的睡眠语句。例如:

代码语言:javascript
复制
from escpos.printer import Usb
from time import sleep

p = Usb(0x0456,0x0808)

sleep(1)

p.text('Hello World\n')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60553035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档