在 Python 中使用 ZLG CAN 适配器开发指南
ZLG (周立功) CAN 适配器是工业自动化和嵌入式开发中常用的总线通信工具,在 Python 中调用 ZLG 设备,可以实现自动化测试、数据记录和协议分析,通常有两种主要实现路径:使用 python-can 库或直接通过 ctypes 调用官方动态链接库 (DLL)。
准备工作
在开始编码前,请确保完成以下基础配置:
- 安装驱动:确保计算机已正确安装 ZLG 官方提供的 USB-CAN 驱动程序。
- 环境匹配:Python 解释器的位数(32位或64位)必须与
ControlCAN.dll文件保持一致,DLL 是 32 位的,请使用 32 位 Python,否则会报错。 - 获取库文件:从 ZLG 官网下载对应的开发包,获取
ControlCAN.dll(Windows) 或libcontrolcan.so(Linux)。
使用 python-can 库(推荐)
python-can
是 Python 处理 CAN 总线的标准库,它通过接口插件支持 ZLG 设备,开发效率最高。
安装库
使用 pip 安装:
pip install python-can
代码示例
import can
# 配置 ZLG 接口参数
# channel: 通道号 (0, 1...)
# bustype: 使用 zlg
# bitrate: 波特率
bus = can.interface.Bus(bustype='zlg', channel=0, bitrate=500000)
# 发送消息
msg = can.Message(arbitration_id=0x123, data=[0x01, 0x02, 0x03], is_extended_id=False)
bus.send(msg)
# 接收消息
msg = bus.recv(timeout=1.0)
if msg:
print(f"收到数据: {msg}")
使用 ctypes 直接调用 ControlCAN.dll
python-can 无法满足特定需求,或者需要调用 ZLG 提供的底层 API,可以使用 Python 的 ctypes 模块加载 DLL。
定义结构体
ZLG 的 API 需要定义对应的 C 语言结构体,VCI_CAN_OBJ。
import ctypes class VCI_CAN_OBJ(ctypes.Structure): _fields_ = [ ("ID", ctypes.c_uint), ("TimeStamp", ctypes.c_uint), ("TimeFlag", ctypes.c_byte), ("SendType", ctypes.c_byte), ("RemoteFlag", ctypes.c_byte), ("ExternFlag", ctypes.c_byte), ("DataLen", ctypes.c_byte), ("Data", ctypes.c_ubyte 8), ("Reserved", ctypes.c_ubyte 3) ]
调用流程
# 加载 DLL
zlg_dll = ctypes.windll.LoadLibrary("ControlCAN.dll")
# 核心流程
# 1. VCI_OpenDevice 打开设备
# 2. VCI_InitCAN 初始化通道
# 3. VCI_StartCAN 启动通道
# 4. VCI_Transmit 发送数据 / VCI_Receive 接收数据
# 5. VCI_CloseDevice 关闭设备
常见问题与注意事项
- DLL 路径问题:如果程序找不到 DLL,请将
ControlCAN.dll放置在 Python 脚本的同级目录,或者将其路径添加到系统环境变量中。PATH
- 数据接收循环:CAN 通信是实时性要求很高的任务,建议将 接收逻辑放在独立的线程中,避免阻塞主程序。
- 波特率设置:ZLG 设备的波特率设置通常需要参考官方手册中的定时器参数(Timing0 和 Timing1),如果使用
python-can,可以直接输入常用波特率数值(如 500000),库会自动转换。 - 多通道支持:如果使用双通道适配器,
channel参数的索引(通常为 0 和 1),确保在初始化时正确配置对应的通道。
调试建议
- 使用 ZLG 官方测试软件 先行测试硬件连接是否正常,如果官方软件无法通信,说明驱动或硬件连接存在问题,与 Python 代码无关。
- 检查 终端电阻:如果通信报错或无数据,请确认 CAN 总线两端是否并联了 120 欧姆终端电阻。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/488216.html



