基于python-can实现的can收发案例(纯手工)

基于python-can实现的can收发案例(纯手工)


文章目录

  • 基于python-can实现的can收发案例(纯手工)
  • 前言
  • 一、python-can是什么?
  • 二、具体代码实现参考
  • 写在结尾


前言

车载相关的大佬可以作为参考,有疑问可以留言交流


一、python-can是什么?

目前发现的是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)



写在结尾

我是一名车载集成测试开发工程师,希望能和志同道合的朋友一起相互学习进步

你可能感兴趣的:(python,开发语言)