#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: Logintern09
from ctypes import *
import os
device_dict = {
"VCI_PCI5121": 1,
"VCI_PCI9810": 2,
"VCI_USBCAN1": 3,
"VCI_USBCAN2": 4,
"VCI_USBCAN2A": 4,
"VCI_PCI9820": 5,
"VCI_CAN232": 6,
"VCI_PCI5110": 7,
"VCI_CANLITE": 8,
"VCI_ISA9620": 9,
"VCI_ISA5420": 10,
"VCI_PC104CAN": 11,
"VCI_CANETUDP": 12,
"VCI_CANETE": 12,
"VCI_DNP9810": 13,
"VCI_PCI9840": 14,
"VCI_PC104CAN2": 15,
"VCI_PCI9820I": 16,
"VCI_CANETTCP": 17,
"VCI_PEC9920": 18,
"VCI_PCI5010U": 19,
"VCI_USBCAN_E_U": 20,
"VCI_USBCAN_2E_U": 21,
"VCI_PCI5020U": 22,
"VCI_EG20T_CAN": 23,
"VCI_PCIE9221": 24,
"VCI_CANDTU200": 32
}
# Timing0和Timing1用来设置CAN波特率
Timing0_dict = {
"10Kbps": 0x31,
"20Kbps": 0x18,
"40Kbps": 0x87,
"50Kbps": 0x09,
"80Kbps": 0x83,
"100Kbps": 0x04,
"125Kbps": 0x03,
"200Kbps": 0x81,
"250Kbps": 0x01,
"400Kbps": 0x80,
"500Kbps": 0x00,
"666Kbps": 0x80,
"800Kbps": 0x00,
"1000Kbps": 0x00,
"33.33Kbps": 0x09,
"66.66Kbps": 0x04,
"83.33Kbps": 0x03
}
# Timing0和Timing1用来设置CAN波特率
Timing1_dict = {
"10Kbps": 0x1C,
"20Kbps": 0x1C,
"40Kbps": 0xFF,
"50Kbps": 0x1C,
"80Kbps": 0xFF,
"100Kbps": 0x1C,
"125Kbps": 0x1C,
"200Kbps": 0xFA,
"250Kbps": 0x1C,
"400Kbps": 0xFA,
"500Kbps": 0x1C,
"666Kbps": 0xB6,
"800Kbps": 0x16,
"1000Kbps": 0x14,
"33.33Kbps": 0x6F,
"66.66Kbps": 0x6F,
"83.33Kbps": 0x6F
}
baud_rate_dict = {
"1000Kbps": 0x060003,
"800Kbps": 0x060004,
"500Kbps": 0x060007,
"250Kbps": 0x1C0008,
"125Kbps": 0x1C0011,
"100Kbps": 0x160023,
"50Kbps": 0x1C002C,
"20Kbps": 0x1600B3,
"10Kbps": 0x1C00E0,
"5Kbps": 0x1C01C1
}
class VCI_INIT_CONFIG(Structure):
_fields_ = [("AccCode", c_uint), # 验收码。SJA1000的帧过滤验收码。对经过屏蔽码过滤为“有关位”进行匹配,全部匹配成功后,此帧可以被接收。
("AccMask", c_uint),
# 屏蔽码。SJA1000的帧过滤屏蔽码。对接收的CAN帧ID进行过滤,对应位为0的是“有关位”,对应位为1的是“无关位”。屏蔽码推荐设置为0xFFFFFFFF,即全部接收。
("Reserved", c_uint), # 保留
("Filter", c_ubyte), # 滤波方式 0/1 接收所有类型 滤波器同时对标准帧与扩展帧过滤!
# 2 只接收标准帧 滤波器只对标准帧过滤,扩展帧将直接被滤除。
# 3 只接收扩展帧 滤波器只对扩展帧过滤,标准帧将直接被滤除
("Timing0", c_ubyte), # 波特率定时器 0
("Timing1", c_ubyte), # 波特率定时器 1
("Mode", c_ubyte) # 模式。=0表示正常模式(相当于正常节点),=1表示只听模式(只接收,不影响总线),=2表示自发自收模式(环回模式)。
]
class VCI_CAN_OBJ(Structure): # VCI_CAN_OBJ结构体是CAN帧结构体,即1个结构体表示一个帧的数据结构。在发送函数VCI_Transmit和接收函数VCI_Receive中,被用来传送CAN信息帧。
_fields_ = [("ID", c_uint), # 帧ID。32位变量,数据格式为靠右对齐
("TimeStamp", c_uint), # 设备接收到某一帧的时间标识。时间标示从CAN卡上电开始计时,计时单位为0.1ms。
("TimeFlag", c_ubyte), # 是否使用时间标识,为1时TimeStamp有效,TimeFlag和TimeStamp只在此帧为接收帧时有意义。
("SendType", c_ubyte),
# 发送帧类型。=0时为正常发送(发送失败会自动重发,重发时间为4秒,4秒内没有发出则取消);=1时为单次发送(只发送一次,发送失败不会自动重发,总线只产生一帧数据);其它值无效。
("RemoteFlag", c_ubyte), # 是否是远程帧。=0时为为数据帧,=1时为远程帧(数据段空)。
("ExternFlag", c_ubyte), # 是否是扩展帧。=0时为标准帧(11位ID),=1时为扩展帧(29位ID)。
("DataLen", c_ubyte), # 数据长度 DLC (<=8),即CAN帧Data有几个字节。约束了后面Data[8]中的有效字节
("Data", c_ubyte * 8),
# CAN帧的数据。由于CAN规定了最大是8个字节,所以这里预留了8个字节的空间,受DataLen约束。如DataLen定义为3,即Data[0]、Data[1]、Data[2]是有效的
("Reserved", c_ubyte * 3) # 系统保留
]
class _RX_CAN_OBJ(Structure):
_fields_ = [('ID', c_uint),
('TimeStamp', c_uint),
('TimeFlag', c_byte),
('SendType', c_byte),
('RemoteFlag', c_byte),
('ExternFlag', c_byte),
('DataLen', c_byte),
('Data', c_byte*8),
('Reserved', c_byte*3)]
CanDLLName = 'ControlCAN.dll'
dll_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), CanDLLName)
canDLL = windll.LoadLibrary(dll_path)
def open_device(DevType, DevIndex, Reserved=0):
"""
打开设备
:param DevType:
:param DevIndex:
:param Reserved:
:return: 返回值=1,表示操作成功;=0表示操作失败;=-1表示USB-CAN设备不存在或USB掉线。
"""
res = canDLL.VCI_OpenDevice(DevType, DevIndex, Reserved)
return res
def set_reference(DevType, DevIndex, CANIndex, RefType, pData):
"""
必须在调用 VCI_InitCAN 之前调用本函数在这里设置通讯的波特率。
:param DevType:
:param DevIndex:
:param CANIndex:
:param RefType: 参数类型,默认为0
:param pData: 波特率设置:0x1C0008 250Kbps, 0x060007 500Kbps
:return:
"""
res = canDLL.VCI_SetReference(DevType, DevIndex, CANIndex, RefType, pointer(c_int(pData)))
return res
def connect_device(DevType, DevIndex):
res = canDLL.VCI_ConnectDevice(DevType, DevIndex)
return res
def ini_can(DevType, DevIndex, CANIndex, InitConfig):
"""
初始化某一路can
:param DevType:
:param DevIndex:
:param CANIndex:
:param InitConfig:
:return:
"""
res = canDLL.VCI_InitCAN(DevType, DevIndex, CANIndex, pointer(InitConfig))
return res
def start_device(DevType, DevIndex, CANIndex):
"""
:param DevType:
:param DevIndex:
:param CANIndex:
:return: 返回值=1,表示操作成功;=0表示操作失败;=-1表示USB-CAN设备不存在或USB掉线。
"""
res = canDLL.VCI_StartCAN(DevType, DevIndex, CANIndex)
return res
def clear_buffer(DevType, DevIndex, CANIndex):
"""
清空接收缓存区
:param DevType:
:param DevIndex:
:param CANIndex:
:return:
"""
res = canDLL.VCI_ClearBuffer(DevType, DevIndex, CANIndex)
return res
def close_device(DevType, DevIndex):
res = canDLL.VCI_CloseDevice(DevType, DevIndex)
return res
def trans_msg(DeviceType, DeviceInd, CANInd, pSend, Length):
"""
:param DeviceType:
:param DeviceInd:
:param CANInd:
:param pSend:
:param Length:
:return: 返回实际发送的帧数,=-1表示USB-CAN设备不存在或USB掉线。
"""
res = canDLL.VCI_Transmit(DeviceType, DeviceInd, CAN
python调用32位的ControlCan.dll实现can报文的收发
需积分: 5 109 浏览量
2022-11-05
11:55:32
上传
评论 1
收藏 4KB RAR 举报
Logintern09
- 粉丝: 678
- 资源: 16
最新资源
- 基于matlab实现文档+程序边缘计算任务卸载与资源调度的算法,是论文的源代码,具有价值.rar
- 什么是学生成绩管理系统c++以及学习学生成绩管理系统的意义
- 什么是词向量-以及学习关于了解词向量的意义
- 什么是mybatis动态sql以及学习mybatis动态sql的意义
- 华为数据治理方法论,包括:数据治理框架、数据治理组织架构、数据治理度量评估体系以及华为数据治理案例分享
- 基于matlab实现对表面肌电信号进行归一化处理,并对归一化后的图形显示 .rar
- 基于matlab实现单级倒立摆的 T-S 模型 包括 LMI 程序源码
- 图书管理系统(struts+hibernate+spring+ext).rar
- 基于matlab实现此压缩包包含语音信号处理中的语音变声代码加音频.rar
- STM32使用PWM驱动舵机并通过OLED显示
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈