import ctypes import time import numpy as np # === DLL 加载 === dll = ctypes.WinDLL(r"D:\BodyBalanceEvaluation\backend\dll\smitsense\SMiTSenseUsbWrapper.dll") # === DLL 函数声明 === dll.SMiTSenseUsb_Init.argtypes = [ctypes.c_int] dll.SMiTSenseUsb_Init.restype = ctypes.c_int dll.SMiTSenseUsb_ScanDevices.argtypes = [ctypes.POINTER(ctypes.c_int)] dll.SMiTSenseUsb_ScanDevices.restype = ctypes.c_int dll.SMiTSenseUsb_OpenAndStart.argtypes = [ ctypes.c_int, ctypes.POINTER(ctypes.c_uint16), ctypes.POINTER(ctypes.c_uint16) ] dll.SMiTSenseUsb_OpenAndStart.restype = ctypes.c_int dll.SMiTSenseUsb_GetLatestFrame.argtypes = [ ctypes.POINTER(ctypes.c_uint16), ctypes.c_int ] dll.SMiTSenseUsb_GetLatestFrame.restype = ctypes.c_int dll.SMiTSenseUsb_StopAndClose.argtypes = [] dll.SMiTSenseUsb_StopAndClose.restype = ctypes.c_int # === 初始化设备 === ret = dll.SMiTSenseUsb_Init(0) if ret != 0: raise RuntimeError(f"Init failed: {ret}") count = ctypes.c_int() ret = dll.SMiTSenseUsb_ScanDevices(ctypes.byref(count)) if ret != 0 or count.value == 0: raise RuntimeError("No devices found") # 打开设备 rows = ctypes.c_uint16() cols = ctypes.c_uint16() ret = dll.SMiTSenseUsb_OpenAndStart(0, ctypes.byref(rows), ctypes.byref(cols)) if ret != 0: raise RuntimeError("OpenAndStart failed") rows_val, cols_val = rows.value, cols.value frame_size = rows_val * cols_val buf_type = ctypes.c_uint16 * frame_size buf = buf_type() # 创建一个 NumPy 数组视图,复用内存 data_array = np.ctypeslib.as_array(buf).reshape((rows_val, cols_val)) print(f"设备已打开: {rows_val}x{cols_val}") try: while True: ret = dll.SMiTSenseUsb_GetLatestFrame(buf, frame_size) time.sleep(1) # while True: # ret = dll.SMiTSenseUsb_GetLatestFrame(buf, frame_size) # if ret == 0: # # data_array 已经复用缓冲区内存,每次直接访问即可 # # 例如打印最大值和前5行前5列的数据 # print("最大压力值:", data_array.max()) # print("前5x5数据:\n", data_array[:5, :5]) # else: # print("读取数据帧失败") # time.sleep(1) # 每秒读取一帧 except KeyboardInterrupt: print("退出中...") finally: dll.SMiTSenseUsb_StopAndClose() print("设备已关闭")