import ctypes import time import os # Carrega a DLL dll = ctypes.cdll.LoadLibrary(os.path.abspath("ControlCANFD.dll")) DEVICE_TYPE = 41 # Confirmado: Waveshare USB-CAN-FD DEVICE_INDEX = 0 CHANNEL_INDEX = 0 # === Estruturas === class VCI_INIT_CONFIG(ctypes.Structure): _fields_ = [ ("AccCode", ctypes.c_uint), ("AccMask", ctypes.c_uint), ("Reserved", ctypes.c_uint), ("Filter", ctypes.c_ubyte), ("Timing0", ctypes.c_ubyte), ("Timing1", ctypes.c_ubyte), ("Mode", ctypes.c_ubyte) ] class VCI_CAN_OBJ(ctypes.Structure): _fields_ = [ ("ID", ctypes.c_uint), ("TimeStamp", ctypes.c_uint), ("TimeFlag", ctypes.c_ubyte), ("SendType", ctypes.c_ubyte), ("RemoteFlag", ctypes.c_ubyte), ("ExternFlag", ctypes.c_ubyte), ("DataLen", ctypes.c_ubyte), ("Data", ctypes.c_ubyte * 8), ("Reserved", ctypes.c_ubyte * 3) ] # === Abrir dispositivo === ret = dll.VCI_OpenDevice(DEVICE_TYPE, DEVICE_INDEX, 0) if ret != 1: print("❌ Falha ao abrir dispositivo.") exit() print("βœ… Dispositivo aberto.") # === Configurar canal === config = VCI_INIT_CONFIG() config.AccCode = 0x00000000 config.AccMask = 0xFFFFFFFF config.Reserved = 0 config.Filter = 0 config.Timing0 = 0x00 # para 500 kbps config.Timing1 = 0x1C config.Mode = 0 # normal ret = dll.VCI_InitCAN(DEVICE_TYPE, DEVICE_INDEX, CHANNEL_INDEX, ctypes.byref(config)) if ret != 1: print("❌ Falha ao inicializar CAN.") exit() dll.VCI_StartCAN(DEVICE_TYPE, DEVICE_INDEX, CHANNEL_INDEX) print("πŸš€ Canal iniciado.") # === Montar frame === send_data = VCI_CAN_OBJ() send_data.ID = 0x011 send_data.SendType = 0 # Normal send send_data.RemoteFlag = 0 send_data.ExternFlag = 0 send_data.DataLen = 2 send_data.Data[0] = 0x00 send_data.Data[1] = 0x00 ret = dll.VCI_Transmit(DEVICE_TYPE, DEVICE_INDEX, CHANNEL_INDEX, ctypes.byref(send_data), 1) print(f"πŸ“€ Enviado para ID 0x011: 00 00 - Resultado: {ret}") # === Escutar resposta === recv_buffer = (VCI_CAN_OBJ * 100)() print("πŸ”Ž Aguardando resposta por atΓ© 3 segundos...") start = time.time() while time.time() - start < 3: recv_count = dll.VCI_Receive(DEVICE_TYPE, DEVICE_INDEX, CHANNEL_INDEX, ctypes.byref(recv_buffer), 100, 100) if recv_count > 0: for i in range(recv_count): can_obj = recv_buffer[i] data = " ".join(f"{can_obj.Data[j]:02X}" for j in range(can_obj.DataLen)) print(f"πŸ” ID: {can_obj.ID:03X}, DLC: {can_obj.DataLen}, Data: {data}") break time.sleep(0.1) else: print("βŒ› Nenhuma resposta recebida.")