我在数字秤上遇到技术问题。让我介绍一下我的工作背景:
我想同时使用3个数字刻度来监控水槽实验(河流的比例模型)的沉积物和水的输出。
现在我是Python的新手(老实说,并且编码),所以这是我的第一个脚本。 我在Python 2.7下使用Windows 7的实验室计算机上工作。 我已经下载并安装了PyUSb和libusb。
我将向您介绍我的问题,因为我也遇到过类似的问题,但是网上没有解决方案对我有用。
我用DYMO 10公斤秤。
这是我使用的第一个代码,该代码改编自此链接:http://steventsnyder.com/reading-a-dymo-usb-scale-using-python/
import usb.core
import usb.util
import time
root = "C:\\Users\\lszewczyk\\Travail\\Laboratoire\\Balance\\"
VENDOR_ID1 = 0x0922
PRODUCT_ID1 = 0x8003
def scale1():
device = usb.core.find(idVendor=VENDOR_ID1, idProduct=PRODUCT_ID1)
print VENDOR_ID1
print PRODUCT_ID1
# use the first/default configuration
device.set_configuration()
# first endpoint
endpoint = device[0][(0,0)][0]
fout1=open(root+'Scale1.txt', 'w')
# read a data packet
data1 = None
while True:
try:
starttime=time.time()
while True:
data1 = device.read(endpoint.bEndpointAddress,
endpoint.wMaxPacketSize)
grams1 = data1[4]+(256*data1[5])
print grams1
elapsed_time1 = time.time() - starttime
print elapsed_time1
fout1.write(str(grams1)+';'+str(elapsed_time1)+'\n')
time.sleep(1 - ((time.time() - starttime) % 1))
except usb.core.USBError as e:
data1 = None
if e.args == ('Operation timed out',):
continue
fout1.close()
scale1()
这给了我一个很好的监控,每隔X秒,重量以克为单位。我很高兴。 但是,由于代码和内容的线性读取,我只能以这种方式使用一个刻度。
那是我被介绍给线程的时候。
因此,我编写了此代码段,该代码段与第一个代码段的功能相同,但是线程化程度很高,并且具有线程终止条件的好处(否则我无法在输出文件中获取数据)与我的体重秤上记录的重量有关。
import usb
import usb.core
import usb.util
import time
from threading import Thread
root = "C:\\Users\\lszewczyk\\Travail\\Laboratoire\\Balance\\"
class Run(Thread):
""" Thread to run the simulation then to compute outputs """
def __init__(self, idVendor, idProduct, fout):
self.idVendor = idVendor
self.idProduct = idProduct
Thread.__init__(self)
self.fout = fout
self.max=5000
def run(self):
device=usb.core.find()
endpoint=device[0][(0,0)][0]
device.set_configuration()
output=open(self.fout, 'w')
data = None
starttime=time.time()
while True:
data = device.read(endpoint.bEndpointAddress,endpoint.wMaxPacketSize)
grams = data[4]+(256*data[5])
if grams<self.max:
print grams
elapsed_time = time.time() - starttime
print elapsed_time
output.write(str(grams)+';'+str(elapsed_time)+'\n')
time.sleep(1 - ((time.time() - starttime) % 1))
else:
break
output.close()
continue
然后我尝试了一个线程(起初只有一个尺度),无论是监视还是结束条件,它都工作得很好。如果您感兴趣,这是输出:
runfile('C:/Users/lszewczyk/Travail/Laboratoire/Balance/Thread.py', wdir='C:/Users/lszewczyk/Travail/Laboratoire/Balance')
Reloaded modules: Run
78
0.00799989700317
78
1.00300002098
78
2.00199985504
78
3.00199985504
78
4.00199985504
78
5.00199985504
78
6.00199985504
78
7.00300002098
78
8.00199985504
78
9.00199985504
78
10.001999855
78
11.003000021
78
12.003000021
但是当我尝试使用两个刻度的线程时,它不起作用。我精确地说,两个音阶都可以独立工作。
这是我的剧本:
import usb.core
import usb.util
from Run import Run
root = "C:\\Users\\lszewczyk\\Travail\\Laboratoire\\Balance\\"
idVendor1=0x0922
idProduct1=0x8006
idVendor2=0x0922
idProduct2=0x8003
device1 = usb.core.find(idVendor=idVendor1, idProduct=idProduct1)
device2 = usb.core.find(idVendor=idVendor2, idProduct=idProduct2)
endpoint1 = device1[0][(0,0)][0]
endpoint2 = device2[0][(0,0)][0]
thread_1=(Run(idVendor1, idProduct1, root+'Scale1.txt'))
thread_2=(Run(idVendor2, idProduct2, root+'Scale2.txt'))
thread_1.start()
thread_2.start()
thread_1.join()
thread_2.join()
这是输出:
80
0.00999999046326
Exception in thread Thread-24:
Traceback (most recent call last):
File "C:\Users\lszewczyk\AppData\Local\Continuum\anaconda2\lib\threading.py", line 801, in __bootstrap_inner
self.run()
File "Run.py", line 34, in run
data = device.read(endpoint.bEndpointAddress,endpoint.wMaxPacketSize)
File "C:\Users\lszewczyk\AppData\Local\Continuum\anaconda2\lib\site-packages\usb\core.py", line 905, in read
intf, ep = self._ctx.setup_request(self, endpoint)
File "C:\Users\lszewczyk\AppData\Local\Continuum\anaconda2\lib\site-packages\usb\core.py", line 190, in setup_request
self.managed_claim_interface(device, intf)
File "C:\Users\lszewczyk\AppData\Local\Continuum\anaconda2\lib\site-packages\usb\core.py", line 146, in managed_claim_interface
self.backend.claim_interface(self.handle, i)
File "C:\Users\lszewczyk\AppData\Local\Continuum\anaconda2\lib\site-packages\usb\backend\libusb0.py", line 468, in claim_interface
_check(_lib.usb_claim_interface(dev_handle, intf))
File "C:\Users\lszewczyk\AppData\Local\Continuum\anaconda2\lib\site-packages\usb\backend\libusb0.py", line 380, in _check
raise USBError(errmsg, ret)
USBError: [Errno None] libusb0-dll:err [claim_interface] could not claim interface 0, win error: La ressource demand�e est en cours d�utilisation.
80
1.00499987602
80
2.00600004196
80
3.00600004196
80
4.00600004196
80
5.00600004196
80
6.00499987602
140
7.00600004196
[EDIT]我忘记了该错误部分是用法语编写的,所以这是最后一行的翻译: ``资源需求不断提高利用率''。表示“请求的资源正忙”
其中一个比例可以正常使用,但另一个不能声明接口0。
我已经尽力想更正Run
脚本的第34行。我还尝试了不同的驱动程序,并且在网上找到了针对类似问题的许多建议解决方案。我特别尝试将目标对准特定的接口或总线,但是失败了,并且/或者没有新的东西出现。
有人领先吗? 我想说明一些事情:首先,我的代码的核心是在网上借用和修改的,因此它可能不是最优化的代码。因为这是我的第一个程序,所以请放心,但是欢迎任何建议。其次,我经验不足,因此问题可能会有非常简单的解决方案,请再次耐心等待。 我会随时为您提供所需的精度。
在此先感谢您的输入。
您真的, 莱奥·塞维奇克(LéoSzewczyk)