同时使用2个USB数字秤进行监视

时间:2018-08-02 14:24:18

标签: python usb scale hid digital

我在数字秤上遇到技术问题。让我介绍一下我的工作背景:

我想同时使用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)

0 个答案:

没有答案