1

有効なリクエストがWebサーバーにヒットしたときに、Pythonとpywinusb-0.3.2を使用してUSB重量計からデータを読み取ろうとしています(requested_serial_numberクエリ文字列から来ています)。

だから私は私の中に次のコードを持っていますdo_GET:

all_hids = hid.find_all_hid_devices()

if all_hids:
    for index, device in enumerate(all_hids):
        if device.serial_number == requested_serial_number:
            device.open()
            try:
                device.set_raw_data_handler(scales_handler)
                while True:
                    sleep(0.1)
            except GotStableWeightException as e:
                self.do_HEAD(200)
                self.send_body(e.value)

そして、これは私のscales_handler(およびカスタム例外定義)です:

def scales_handler(data):
    print("Byte 0: {0}".format(data[0]))
    print("Byte 1: {0}".format(data[1]))
    print("Byte 2: {0}".format(data[2]))
    print("Byte 3: {0}".format(data[3]))
    print("Byte 4: {0}".format(data[4]))
    print("Byte 5: {0}".format(data[5]))
    print("All: {0}".format(data))
    if data[1] == 4:
        raise GotStableWeightException(data[4] + (256 * data[5]))

class GotStableWeightException(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)

したがって、プロセスは次のとおりです。

  1. Python は、http.serverHTTPServerBaseHTTPRequestHandler
  2. リクエストが来て、私の機能にルーティングされdo_GETます。
  3. do_GETいくつかの基本的な検証を実行してから、一致する USB HID を検索します (私の最初のコード サンプル)。
  4. 一致が見つかった場合は、デバイスを開き、データ ハンドラーを渡します。

私が達成しようとしていること:

data[1] == 4データハンドラーが(スケールからの安定した読み取りを示す)までスケールからの読み取りを継続できるようにしたいと考えています。その時点で、この読み取り値を my で取得do_GETして待機中の HTTP クライアントに送信し、デバイスを閉じて関数を終了したいと考えています。

ただし、 myGotStableWeightExceptionは my 内に引っかかっていませんdo_GET。別のスレッドでスローされているためだと思います。複数のスレッドを使用したプログラミングは初めてで、条件do_GETに一致した結果を元に戻す方法がわかりません。data[1] == 4

編集

私が得るもの:

からターミナルに表示される出力は次のscales_handlerとおりです。

Byte 0: 3
Byte 1: 4
Byte 2: 2
Byte 3: 0
Byte 4: 204
Byte 5: 0
All: [3, 4, 2, 0, 204, 0]
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python33\lib\threading.py", line 639, in _bootstrap_inner
    self.run()
  File "C:\Python33\lib\site-packages\pywinusb-0.3.2-py3.3.egg\pywinusb\hid\core.py", line 886, in run
    hid_object._process_raw_report(raw_report)
  File "C:\Python33\lib\site-packages\pywinusb-0.3.2-py3.3.egg\pywinusb\hid\helpers.py", line 64, in new_function
    return function_target(*args, **kw)
  File "C:\Python33\lib\site-packages\pywinusb-0.3.2-py3.3.egg\pywinusb\hid\core.py", line 714, in _process_raw_report
    self.__raw_handler(helpers.ReadOnlyList(raw_report))
  File "C:\USB HID Scales\server.py", line 28, in scales_handler
    raise GotStableWeightException(data[4] + (256 * data[5]))
GotStableWeightException: 204
4

1 に答える 1