有効なリクエストが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)
したがって、プロセスは次のとおりです。
- Python は、http.server
HTTPServer
とBaseHTTPRequestHandler
- リクエストが来て、私の機能にルーティングされ
do_GET
ます。 - は
do_GET
いくつかの基本的な検証を実行してから、一致する USB HID を検索します (私の最初のコード サンプル)。 - 一致が見つかった場合は、デバイスを開き、データ ハンドラーを渡します。
私が達成しようとしていること:
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