USB 调试工具(python2.7 + Tkinter + pyusb/pywinusb)

项目地址:USB-HID-TEST

整体预览图(win8下的效果):

======================

项目结构:

COM

--hidHelper.py

--usbHelper.py

UI

--Adaptive.py

--HID_TESTUI.py

--PyTkinter.py

main.py

======================

UI文件夹:

使用PyTkinter来初始化一些颜色配置(个人喜好)

实现代码:

  1 #! /usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3 
  4 '''
  5 Tkinter控件初始化配置(默认为深色)
  6 '''
  7 __author__ = "jakey.chen"
  8 __version__ = "v1.0"
  9 
 10 
 11 import Tkinter as tk
 12 
 13 g_default_theme = "dark"
 14 # g_default_theme = "default"
 15 
 16 class PyButton(tk.Button):
 17     '''
 18     Button
 19     '''
 20     def __init__(self, master, theme=g_default_theme, **kv):
 21         self.theme = theme
 22         self.kv = kv
 23         self.temp = dict()
 24         self.choose_theme()
 25         tk.Button.__init__(self, master, self.temp)
 26 
 27     def choose_theme(self):
 28         if self.theme == "dark":
 29             dark_theme_dict = {
 30                                 "activebackground": "#00B2EE",
 31                                 "activeforeground": "#E0EEEE",
 32                                 "bg": "#008B8B",
 33                                 "fg": "#FFFFFF"
 34                               }
 35             for key,value in dark_theme_dict.items():
 36                 self.temp[key] = value
 37 
 38             for key,value in self.kv.items():
 39                 self.temp[key] = value
 40 
 41 class PyLabel(tk.Label):
 42     '''
 43     Label
 44     '''
 45     def __init__(self, master, theme=g_default_theme, **kv):
 46         self.theme = theme
 47         self.kv = kv
 48         self.temp = dict()
 49         self.choose_theme()
 50         tk.Label.__init__(self, master, self.temp)
 51 
 52     def choose_theme(self):
 53         if self.theme == "dark":
 54             dark_theme_dict = {
 55                                 "bg": "#292929",
 56                                 "fg": "#E0EEEE"
 57                               }
 58             for key,value in dark_theme_dict.items():
 59                 self.temp[key] = value
 60 
 61             for key,value in self.kv.items():
 62                 self.temp[key] = value
 63 
 64 class PyLabelFrame(tk.LabelFrame):
 65     '''
 66     Frame
 67     '''
 68     def __init__(self, master, theme=g_default_theme, **kv):
 69         self.theme = theme
 70         self.kv = kv
 71         self.temp = dict()
 72         self.choose_theme()
 73         tk.LabelFrame.__init__(self, master, self.temp)
 74 
 75     def choose_theme(self):
 76         if self.theme == "dark":
 77             dark_theme_dict = {
 78                                 "bg": "#292929",
 79                                 "fg": "#1E90FF"
 80                               }
 81             for key,value in dark_theme_dict.items():
 82                 self.temp[key] = value
 83 
 84             for key,value in self.kv.items():
 85                 self.temp[key] = value
 86 
 87 class PyListbox(tk.Listbox):
 88     '''
 89     Listbox
 90     '''
 91     def __init__(self, master, theme=g_default_theme, **kv):
 92         self.theme = theme
 93         self.kv = kv
 94         self.temp = dict()
 95         self.choose_theme()
 96         tk.Listbox.__init__(self, master, self.temp)
 97 
 98     def choose_theme(self):
 99         if self.theme == "dark":
100             dark_theme_dict = {
101                                 "bg": "#292929",
102                                 "fg": "#1E90FF",
103                                 "selectbackground": "#00B2EE"
104                               }
105             for key,value in dark_theme_dict.items():
106                 self.temp[key] = value
107 
108             for key,value in self.kv.items():
109                 self.temp[key] = value
110 
111 class PyText(tk.Text):
112     '''
113     Text
114     '''
115     def __init__(self, master, theme=g_default_theme, **kv):
116         self.theme = theme
117         self.kv = kv
118         self.temp = dict()
119         self.choose_theme()
120         tk.Text.__init__(self, master, self.temp)
121 
122     def choose_theme(self):
123         if self.theme == "dark":
124             dark_theme_dict = {
125                                 "bg": "#292929",
126                                 "fg": "#1E90FF"
127                               }
128             for key,value in dark_theme_dict.items():
129                 self.temp[key] = value
130 
131             for key,value in self.kv.items():
132                 self.temp[key] = value
133 
134 class PyCheckbutton(tk.Checkbutton):
135     '''
136     Checkbutton
137     '''
138     def __init__(self, master, theme=g_default_theme, **kv):
139         self.theme = theme
140         self.kv = kv
141         self.temp = dict()
142         self.choose_theme()
143         tk.Checkbutton.__init__(self, master, self.temp)
144 
145     def choose_theme(self):
146         if self.theme == "dark":
147             dark_theme_dict = {
148                                 "bg": "#292929",
149                                 "fg": "#FFFFFF",
150                                 "activebackground": "#292929",
151                                 "activeforeground": "#FFFFFF",
152                                 "selectcolor": "#292929"
153                               }
154             for key,value in dark_theme_dict.items():
155                 self.temp[key] = value
156 
157             for key,value in self.kv.items():
158                 self.temp[key] = value
159 
160 class PyRadiobutton(tk.Radiobutton):
161     '''
162     Radiobutton
163     '''
164     def __init__(self, master, theme=g_default_theme, **kv):
165         self.theme = theme
166         self.kv = kv
167         self.temp = dict()
168         self.choose_theme()
169         tk.Radiobutton.__init__(self, master, self.temp) 
170 
171     def choose_theme(self):
172         if self.theme == "dark":
173             dark_theme_dict = {
174                                 "bg": "#292929",
175                                 "fg": "#FFFFFF",
176                                 "activebackground": "#292929",
177                                 "selectcolor": "#292929"
178                               }
179             for key,value in dark_theme_dict.items():
180                 self.temp[key] = value
181 
182             for key,value in self.kv.items():
183                 self.temp[key] = value
184 
185 
186 class PyEntry(tk.Entry):
187     '''
188     Entry
189     '''
190     def __init__(self, master, theme=g_default_theme, **kv):
191         self.theme = theme
192         self.kv = kv
193         self.temp = dict()
194         self.choose_theme()
195         tk.Entry.__init__(self, master, self.temp)
196 
197     def choose_theme(self):
198         if self.theme == "dark":
199             dark_theme_dict = {
200                                 "bg": "#292929",
201                                 "fg": "#E0EEEE",
202                                 "insertbackground": "#E0EEEE"
203                               }
204             for key,value in dark_theme_dict.items():
205                 self.temp[key] = value
206 
207             for key,value in self.kv.items():
208                 self.temp[key] = value
209 
210 if __name__ == '__main__':
211     root = tk.Tk()
212     root.configure(bg="#292929")
213     PyButton(root, text="1234", font=("Monaco", 12)).pack()
214     PyLabel(root, text="123", font=("Monaco", 15)).pack()
215     PyCheckbutton(root, text="123", font=("Monaco", 15)).pack()
216     PyEntry(root, font=("Monaco", 15)).pack()
217     PyText(root, font=("Monaco", 15), height=2, width=20).pack()
218     listbox_0 = PyListbox(root, height=2, font=("Monaco", 15))
219     listbox_0.pack()
220     for i in range(2):
221         listbox_0.insert("end", i)
222     radio_intvar = tk.IntVar()
223     PyRadiobutton(root, text="001", variable=radio_intvar, value=0, font=("Monaco", 15)).pack()
224     PyRadiobutton(root, text="002", variable=radio_intvar, value=1, font=("Monaco", 15)).pack()
225     radio_intvar.set(1)
226 
227     root.mainloop()

主界面构建不表,使用LabelFrame通过grid布局组成

具体自行查看项目代码

======================

COM文件夹

Windows下:

使用pywinusb

 1 #! /usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 '''
 5 win下使用的HID设备通讯帮助类
 6 '''
 7 __author__ = "jakey.chen"
 8 __version__ = "v1.0"
 9 
10 
11 import pywinusb.hid as hid
12 
13 
14 class hidHelper(object):
15     def __init__(self, vid=0x1391, pid=0x2111):
16         self.alive = False
17         self.device = None
18         self.report = None
19         self.vid = vid
20         self.pid = pid
21 
22     def start(self):
23         '''
24         开始,打开HID设备
25         '''
26         _filter = hid.HidDeviceFilter(vendor_id = self.vid, product_id = self.pid)
27         hid_device = _filter.get_devices()
28         if len(hid_device) > 0:
29             self.device = hid_device[0]
30             self.device.open()
31             self.report = self.device.find_output_reports()
32             self.alive = True
33 
34     def stop(self):
35         '''
36         停止,关闭HID设备
37         '''
38         self.alive = False
39         if self.device:
40             self.device.close()
41 
42     def setcallback(self):
43         '''
44         设置接收数据回调函数
45         '''
46         if self.device:
47             self.device.set_raw_data_handler(self.read)
48 
49     def read(self, data):
50         '''
51         接收数据回调函数
52         '''
53         print([hex(item).upper() for item in data[1:]])
54 
55     def write(self, send_list):
56         '''
57         向HID设备发送数据
58         '''
59         if self.device:
60             if self.report:
61                 self.report[0].set_raw_data(send_list)
62                 bytes_num = self.report[0].send()
63                 return bytes_num
64 
65 
66 if __name__ == '__main__':
67     myhid = hidHelper()
68     myhid.start()
69     if myhid.alive:
70         myhid.setcallback()
71         send_list = [0x00 for i in range(65)]
72         myhid.write(send_list)
73         import time
74         time.sleep(0.5)
75         myhid.stop()

Linux(我使用的是Ubuntu14.04)下:

  1 #! /usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3 
  4 '''
  5 linux下使用的usb设备通讯帮助类
  6 '''
  7 __author__ = "jakey.chen"
  8 __version__ = "v1.0"
  9 
 10 
 11 import threading
 12 import usb.util
 13 import usb.core
 14 
 15 
 16 class usbHelper(object):
 17     def __init__(self, vid=0x1391, pid=0x2111):
 18         self.alive = False
 19         self.handle = None
 20         self.size = 64
 21         self.vid = vid
 22         self.pid = pid
 23 
 24     def start(self):
 25         '''
 26         开始,打开usb设备
 27         '''
 28         self.dev = usb.core.find(idVendor=self.vid, idProduct=self.pid)
 29         if self.dev != None:
 30             self.ep_in = self.dev[0][(0,0)][0].bEndpointAddress
 31             self.ep_out = self.dev[0][(0,0)][1].bEndpointAddress
 32             self.size = self.dev[0][(0,0)][1].wMaxPacketSize
 33         self.open()
 34         self.alive = True
 35 
 36     def stop(self):
 37         '''
 38         停止,关闭usb设备,释放接口
 39         '''
 40         self.alive = False
 41         if self.handle:
 42             self.handle.releaseInterface()
 43 
 44     def open(self):
 45         '''
 46         打开usb设备
 47         '''
 48         busses = usb.busses()
 49         for bus in busses:
 50             devices = bus.devices
 51             for device in devices:
 52                 if device.idVendor == self.vid and device.idProduct == self.pid:
 53                     self.handle = device.open()
 54                     # Attempt to remove other drivers using this device.
 55                     if self.dev.is_kernel_driver_active(0):
 56                         try:
 57                             self.handle.detachKernelDriver(0)
 58                         except Exception as e:
 59                             self.alive = False
 60                     try:
 61                         self.handle.claimInterface(0)
 62                     except Exception as e:
 63                         self.alive = False
 64 
 65     def read(self, size=64, timeout=0):
 66         '''
 67         读取usb设备发过来的数据
 68         '''
 69         if size >= self.size:
 70             self.size = size
 71 
 72         if self.handle:
 73             data = self.handle.interruptRead(self.ep_in, self.size, timeout)
 74 
 75         try:
 76             data_list = data.tolist()
 77             return data_list
 78         except:
 79             return list()
 80 
 81     def write(self, send_list, timeout=1000):
 82         '''
 83         发送数据给usb设备
 84         '''
 85         if self.handle:
 86             bytes_num = self.handle.interruptWrite(self.ep_out, send_list, timeout)
 87             return bytes_num
 88 
 89 if __name__ == '__main__':
 90     import time
 91     dev = usbHelper()
 92 
 93     dev.start()
 94 
 95     send_list = [0xAA for i in range(64)]
 96     dev.write(send_list)
 97     # time.sleep(0.25)
 98     while True: 
 99         try:
100             mylist = dev.read()
101             print mylist
102             if mylist[1] == 0x02: 
103                 break
104         except:
105             dev.stop()
106             break
107     dev.stop()

======================

主函数:界面逻辑。不表,自行查看。

posted @ 2015-04-28 17:07  jakey.chen  阅读(10893)  评论(9编辑  收藏  举报