创新can调试器Linux版
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
3.2 KiB

4 years ago
  1. #python3.8.0 64位(python 32位要用32位的DLL)
  2. #
  3. from ctypes import *
  4. VCI_USBCAN2 = 4
  5. STATUS_OK = 1
  6. class VCI_INIT_CONFIG(Structure):
  7. _fields_ = [("AccCode", c_uint),
  8. ("AccMask", c_uint),
  9. ("Reserved", c_uint),
  10. ("Filter", c_ubyte),
  11. ("Timing0", c_ubyte),
  12. ("Timing1", c_ubyte),
  13. ("Mode", c_ubyte)
  14. ]
  15. class VCI_CAN_OBJ(Structure):
  16. _fields_ = [("ID", c_uint),
  17. ("TimeStamp", c_uint),
  18. ("TimeFlag", c_ubyte),
  19. ("SendType", c_ubyte),
  20. ("RemoteFlag", c_ubyte),
  21. ("ExternFlag", c_ubyte),
  22. ("DataLen", c_ubyte),
  23. ("Data", c_ubyte*8),
  24. ("Reserved", c_ubyte*3)
  25. ]
  26. CanDLLName = './ControlCAN.dll' #把DLL放到对应的目录下
  27. canDLL = windll.LoadLibrary('./ControlCAN.dll')
  28. #Linux系统下使用下面语句,编译命令:python3 python3.8.0.py
  29. #canDLL = cdll.LoadLibrary('./libcontrolcan.so')
  30. print(CanDLLName)
  31. ret = canDLL.VCI_OpenDevice(VCI_USBCAN2, 0, 0)
  32. if ret == STATUS_OK:
  33. print('调用 VCI_OpenDevice成功\r\n')
  34. if ret != STATUS_OK:
  35. print('调用 VCI_OpenDevice出错\r\n')
  36. #初始0通道
  37. vci_initconfig = VCI_INIT_CONFIG(0x80000008, 0xFFFFFFFF, 0,
  38. 0, 0x03, 0x1C, 0)#波特率125k,正常模式
  39. ret = canDLL.VCI_InitCAN(VCI_USBCAN2, 0, 0, byref(vci_initconfig))
  40. if ret == STATUS_OK:
  41. print('调用 VCI_InitCAN1成功\r\n')
  42. if ret != STATUS_OK:
  43. print('调用 VCI_InitCAN1出错\r\n')
  44. ret = canDLL.VCI_StartCAN(VCI_USBCAN2, 0, 0)
  45. if ret == STATUS_OK:
  46. print('调用 VCI_StartCAN1成功\r\n')
  47. if ret != STATUS_OK:
  48. print('调用 VCI_StartCAN1出错\r\n')
  49. #初始1通道
  50. ret = canDLL.VCI_InitCAN(VCI_USBCAN2, 0, 1, byref(vci_initconfig))
  51. if ret == STATUS_OK:
  52. print('调用 VCI_InitCAN2 成功\r\n')
  53. if ret != STATUS_OK:
  54. print('调用 VCI_InitCAN2 出错\r\n')
  55. ret = canDLL.VCI_StartCAN(VCI_USBCAN2, 0, 1)
  56. if ret == STATUS_OK:
  57. print('调用 VCI_StartCAN2 成功\r\n')
  58. if ret != STATUS_OK:
  59. print('调用 VCI_StartCAN2 出错\r\n')
  60. #通道1发送数据
  61. ubyte_array = c_ubyte*8
  62. a = ubyte_array(1,2,3,4, 5, 6, 7, 8)
  63. ubyte_3array = c_ubyte*3
  64. b = ubyte_3array(0, 0 , 0)
  65. vci_can_obj = VCI_CAN_OBJ(0x1, 0, 0, 1, 0, 0, 8, a, b)#单次发送
  66. ret = canDLL.VCI_Transmit(VCI_USBCAN2, 0, 0, byref(vci_can_obj), 1)
  67. if ret == STATUS_OK:
  68. print('CAN1通道发送成功\r\n')
  69. if ret != STATUS_OK:
  70. print('CAN1通道发送失败\r\n')
  71. #通道2接收数据
  72. a = ubyte_array(0, 0, 0, 0, 0, 0, 0, 0)
  73. vci_can_obj = VCI_CAN_OBJ(0x0, 0, 0, 0, 0, 0, 0, a, b)#复位接收缓存
  74. ret = canDLL.VCI_Receive(VCI_USBCAN2, 0, 1, byref(vci_can_obj), 2500, 0)
  75. #print(ret)
  76. while ret <= 0:#如果没有接收到数据,一直循环查询接收。
  77. ret = canDLL.VCI_Receive(VCI_USBCAN2, 0, 1, byref(vci_can_obj), 2500, 0)
  78. if ret > 0:#接收到一帧数据
  79. print('CAN2通道接收成功\r\n')
  80. print('ID:')
  81. print(vci_can_obj.ID)
  82. print('DataLen:')
  83. print(vci_can_obj.DataLen)
  84. print('Data:')
  85. print(list(vci_can_obj.Data))
  86. #关闭
  87. canDLL.VCI_CloseDevice(VCI_USBCAN2, 0)