刚好有时间就记录下项目中的问题,因为技术很菜,所以,各位请见谅。欢迎探讨。
公司要求做一个windows下的工具用来跟产品通讯调试校准,产品是用的tpye-c接口,emmm,我原本是搞嵌入式的,第一次接到这种需求也是很懵,没办法,只能硬着头皮做了。
因为要做GUI,所以,选择了pyqt,python及pyqt安装教程,可以参考下:python及pyqt5安装。
还需要安装pycharm,具体安装和破解自己百度,安装完后,需要设置qtdesigner和pyuic,pycharm添加qtdesigner及pyuic
然后使用qtdesigner设计界面,有点懒打字了,如下图,拖动需要的组件进行设计就好,随便做个演示下吧,主要是后面pyusb的调试:
然后生成.py文件:
python -m PyQt5.uic.pyuic usb.ui -o usbTest.py
usbTest.py代码如下,pyuic自动生成的:

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(800, 600)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.textEdit = QtWidgets.QTextEdit(self.centralwidget)self.textEdit.setGeometry(QtCore.QRect(130, 90, 221, 41))self.textEdit.setObjectName("textEdit")self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(390, 100, 75, 23))self.pushButton.setObjectName("pushButton")self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget)self.textEdit_2.setGeometry(QtCore.QRect(120, 150, 241, 231))self.textEdit_2.setObjectName("textEdit_2")MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))self.menubar.setObjectName("menubar")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")               MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))self.pushButton.setText(_translate("MainWindow", "发送"))

usbDeal.py代码如下:

from PyQt5 import QtCore
from usbTest import Ui_MainWindow
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt, QTimer, pyqtSignal, QObject, QEvent, QThread
from PyQt5.QtGui import QPainter, QPixmap, QMovie
from PyQt5.QtWidgets import QMainWindow, QApplicationimport configparser, usb
import numpy as npUSB_VID = 0x1212
USB_PID = 0x3434
WRITE_BUF = [0]*9
READ_BUF = [0]*9"""
注释掉是因为获取设备放在了每次启动发送数据都获取一次设备列表,这样可以实现动态插拔读写usb设备。
因为项目要实现插入设备能正常读写跟设备调试,一开始我是把获取设备列表放在这里的但是,只有把设备插
入后,然后重启应用才能正确读写usb设备,GitHub上看了pyusb的项目说是libusb不支持windows热插拔通知,
这个问题困扰了我几天,试过重载动态库、释放设备资源接口等但都没有用,后来想到把放在这行放在每次发送
前再获取,处理完数据后再释放点usb设备资源...然后就可以了....插入设备能正常读写,拔出设备再插入设备
也能正常读写....不知道这样做有什么影响,反正能实现需求了...有时间再深入了解吧...
"""
#device_list = list(usb.core.find(find_all=True, idVendor=USB_VID, idProduct=USB_PID))
device_list = list()def printInHex(str,bytes):l = [hex(int(i)) for i in bytes]print(str," ".join(l))# usb数据处理
class USBDealWindow(QMainWindow):                   signal_ui_exec = pyqtSignal(str, QObject, QEvent, list)def __init__(self,parent=None):super(USBDealWindow, self).__init__(parent)self.ui = Ui_MainWindow()                               # UI,usbTest的classself.ui.setupUi(self)self.sendThread = SendThread()                          # 发送线程self.slot_init()                                        # 槽初始化def slot_init(self):                                        # 信号连接到函数,信号槽初始化self.sendThread.singalSendInfo.connect(self.update_info)def update_info(self, string):                              # 更新文本框信息self.ui.textEdit_2.append(string)                       # usbTest.py中的文本框对象textEdit_2@QtCore.pyqtSlot()def on_pushButton_clicked(self):                           # 按钮触发print("start send data to usb")self.sendThread.stop()                                  # 先停止之前的self.sendThread.start()                                 # 再启动class SendThread(QThread):singalSendInfo = pyqtSignal(str)def __init__(self, parent=None):super(SendThread, self).__init__(parent)self.working = Falseself.dev = Noneself.read_ep = Noneself.write_ep = Nonedef __del__(self):self.working = Falseself.wait()def update_device(self, device):self.dev = devicecfg = self.dev.get_active_configuration()intf = cfg[(0,0)]usb.util.claim_interface(self.dev,intf)# 获取写endpointself.write_ep = usb.util.find_descriptor(intf,# match the first OUT endpointcustom_match = \lambda e: \usb.util.endpoint_direction(e.bEndpointAddress) == \usb.util.ENDPOINT_OUT)# 获取读endpointself.read_ep = usb.util.find_descriptor(intf,# match the first IN endpointcustom_match = \lambda e: \usb.util.endpoint_direction(e.bEndpointAddress) == \usb.util.ENDPOINT_IN)def send_usbData(self):if self.dev:# 只是为了记录下,所以发固定的数据测试下,当然界面上的文本框的数据可以获取,懒得写了WRITE_BUF[0] = 0x01WRITE_BUF[1], WRITE_BUF[2] = 0x00, 0xFEWRITE_BUF[3], WRITE_BUF[4] = 0xFE, 0x00WRITE_BUF[5], WRITE_BUF[6] = 0x00, 0xFEWRITE_BUF[7], WRITE_BUF[8] = 0x00, 0x00printInHex("[send]:",WRITE_BUF)self.singalSendInfo.emit(str(WRITE_BUF))self.write_ep.write(WRITE_BUF)# 如果usb设备有返回的话可以加上读取READ_BUF = self.read_ep.read(9, timeout=8*1000)printInHex("[recv]:",READ_BUF)# 再加上读取的数据处理....if len(READ_BUF)==9 and READ_BUF[0]==0x01:print("数据处理")self.singalSendInfo.emit(str(READ_BUF))else:self.singalSendInfo.emit("校准失败")usb.util.dispose_resources(self.dev)usb.util.release_interface(self.dev,0)    def run(self):self.working = Truedevice_list = list(usb.core.find(find_all=True, idVendor=USB_VID, idProduct=USB_PID))if len(device_list) == 0:self.singalSendInfo.emit("没有设备连接")for dev in device_list:self.update_device(dev)self.singalSendInfo.emit("发送数据...")self.send_usbData()self.dev = Noneself.working = Falsedef stop(self):self.working = Falseself.wait()    import sys
if __name__ == '__main__':app = QApplication(sys.argv)form = USBDealWindow() form.setWindowOpacity(1) #设置窗口透明度form.show()sys.exit(app.exec_())
然后创建个bat文本,用pyinstaller生成EXE文件,936和6501好像都可以,不太懂,刚接触python:
chcp 936
pyinstaller -F -w usbDeal.py
pause

当然生成EXE文件也有坑,比如说,执行文件失败,Fail to execute script XXX,可以在用pyinstaller生成EXE的时候去掉-w 选项,会有cmd窗口,然后执行的时候会提示错误原因:

打包之后可能会抛出异常“No backend available”,这是因为pyinstaller在打包的时候没有把usb通信相关的dll文件打包进来 ,修改项目同目录下的usbDeal.spec文件:

# -*- mode: python ; coding: utf-8 -*-block_cipher = None
binaries = [('C:\\Windows\\System32\\libusb0.dll', '.'),
]a = Analysis(['usbDeal.py'],pathex=['E:\\UIDesigner'],binaries=binaries,datas=[],hiddenimports=[],hookspath=[],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,cipher=block_cipher)
exe = EXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,[],name='usbDeal',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,upx_exclude=[],runtime_tmpdir=None,console=True )

然后再修改create_exe.bat脚本,使用.spec文件生成EXE而不是.py文件:

chcp 936
pyinstaller -F usbDeal.spec
pause

最后在dist目录下生成文件EXE。

不想写了…

Pyusb之usb开发记录相关推荐

  1. 二.开发记录之派勤工控机远程使用和ubuntu和ROS环境配置

    专栏系列文章如下: 一.开发记录之AHRS.惯导传感器SBG-Ellipse-N传感器配置和使用_goldqiu的博客-CSDN博客 一.安装系统 1. 网上下载ubuntu16.04镜像: 2. 使 ...

  2. 低功耗蓝牙芯片CH579系列开发记录

    低功耗蓝牙芯片CH579系列开发记录 文章目录 低功耗蓝牙芯片CH579系列开发记录 前言 一.CH579系列芯片 1.1 引脚排列 1.2 引脚描述 1.3 系统结构 1.4 最小系统 二.资料下载 ...

  3. 原创:Android应用开发记录-Andorid歌词秀(4)完成,含源码

    最新版软件请参照: Android应用开发记录-字幕播放器(5)完善 功能简介: 1.自动读取与音乐相同位置的歌词文件 2.根据播放进度,表示当前的歌词 3.按歌词语句快进,快退. 可以用来记歌词,学 ...

  4. 大恒水星相机开发记录

    大恒水星相机开发记录 前面的话: 最近搞了一个大恒的相机MER-500-14GC,本着这可是行业龙头的工业相机嘛,终归是在学校摸到了真正的工业级产品了.(٩(๑>◡<๑)۶) 想着用ope ...

  5. STM32 USB开发

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 STM32 使用Cube ...

  6. OBDII车载诊断仪开发记录之一波三折(-)BlueTooth 3.0

    前言 根据GB18285,GB3847 机动车辆的检测引入了OBD检查,所以需要开发一款OBD诊断仪,配合之前的工作,将车辆OBD数据上报.当初接到这个任务的时候,可以说是一脸懵逼,因为特么之前没接触 ...

  7. USB | 通过PyUSB实现USB接口通信

    本文总结 - Update: 2022 / 10 / 19 USB | 通过PyUSB实现USB接口通信 Mark 参考链接 Mark 先mark,后面再更新 1. 参考链接 Windows环境下基于 ...

  8. Digispark USB开发板的应用_写给刚学完C的你

    文章目录 学前小故事 一.Hello Digispark 1.硬件介绍 2.实现原理 3.配置环境 4.第一个USB开发板程序 二.结构介绍以及C语言美化 1.#difine定义常量 2.函数封装调用 ...

  9. Anytime项目开发记录0

    Anytime,中文名:我很忙. 开发者:孤独的猫咪神. 这个项目会持续更新,直到我决定不再维护这个APP. 2014年3月10日:近日有事,暂时断更.希望可以会尽快完事. 2014年3月27日:很抱 ...

最新文章

  1. Bootstrap按钮组件
  2. 基于Bootstrap、Jquery的自适应导航栏
  3. 轻松恢复误删除的共享文件,DPM2007系列之六
  4. ux和ui_糟糕的UI与UX番茄酱模因
  5. python opengl_Python环境搭建之OpenGL
  6. (15)Vue.js 计算属性
  7. PL/SQL Developer14中文版,记住登录密码和常用快捷方式
  8. opencv编译问题
  9. 如何让你的 Git 历史保持“干净”?!
  10. 移动端小总结(1)---meta、input和单行多行文字溢出省略号
  11. 如何在ECLIPSE中使用MVN CLEAN INSTALL
  12. 安全模式 提权_WEB安全第八章实战篇01 提权安全狗服务器
  13. C语言学习系列二十六——二维数组定义
  14. 计算机显示器闪烁,电脑显示器闪屏怎么办 显示器闪屏原因【解决方法】
  15. 第1节 基本数据类型分析
  16. 最流行的前端框架vue基础
  17. 使用metalink批量下载sentinel数据
  18. 2022年低压电工复训题库及在线模拟考试
  19. 光纤连接器的连接方法
  20. JAVA语言程序设计教程张席_Java语言程序设计教程

热门文章

  1. hpm1005能扫描不能打印_浅谈如何选购人像扫描仪
  2. ceph 部署mds文件系统
  3. ceph-mds文件系统操作指南
  4. 7. 实现用户的历史记录功能
  5. 智能手表音频特性测试_研华测试与测量解决方案2019金秋版
  6. Avid.Sibelius.v7.1.3-DYNAMiCS
  7. 5月18日德玛西亚服务器怎么维护,LOL5.18测试服更新内容是什么_LOL5月18日测试服更新内容介绍_游戏堡...
  8. 2021湖北省潜江市潜江高考成绩查询,2021年潜江高考状元名单公布,潜江文理科状元是谁多少分...
  9. 2020年2月的第一篇
  10. 给中国学生的一封信:从诚信…