车载相关的大佬可以作为参考,有疑问可以留言交流
目前发现的是Python-can是一个支持多种can总线工具can总线程序库,目前已知可以正常调用的包含
kvaser、PCAN、英特佩斯等相关can设备
import can
from typing import Optional
class CanTool():
def __init__(self,device: Optional[str], channel: Optional[str], bitrate: Optional[int]):
"""
初始化类时即创建总线对象
param1:设备名
param2:通道名
param3:波特率
"""
self.__bus = can.interface.Bus(bustype=device, channel=channel, bitrate=bitrate)#是否在初始化时创建对象基于项目而定
logger = can.Logger("logfile.asc") #创建一个log文件
listeners = [
self.put_mq, #回调函数
logger, # 保存报文的对象
]
self.notifier = can.Notifier(self.__bus, listeners) #设置一个监听
def __put_mq(self,msg):
"""
功能:通过队列实现数据的写入和读取
:param msg: 回调返回的对象
"""
if not self.mq.full():
self.mq.put_nowait(msg)
def send_data(self,id: Optional[int],listdata: Optional[list[int]]):
msg = can.Message(arbitration_id=id,#此处传入整形
is_extended_id=False, #此处参数判断是否是扩展帧
data=listdata #此处参数传入一个纯整形的列表
)
self.__bus.send(msg)
def set_filters(self,id: Optional[int]):
"""
功能:设置一个筛选器
para1:报文id
"""
if filter_id < 2147483648:#判断是否为标准帧
self.__bus.set_filters([{"can_id": filter_id, "can_mask": 0x7FF, "extended": False}])
else:
self.__bus.set_filters([{"can_id": filter_id, "can_mask": 0x1FFFFFFF, "extended": True}])
def can_recv(self,filter_id: Optional[int]):
"""
循环检测接收到的报文中是否有需要的id
para1:报文id
"""
while True:
if not self.mq.empty():
frame = self.mq.get_nowait()
if filter_id == frame.arbitration_id:
print(frame.data)
break
time.sleep(0.1)
我是一名车载集成测试开发工程师,希望能和志同道合的朋友一起相互学习进步