您的位置:

python-can详解

python-can是一个Python库,提供了数十个协议和接口,可以帮助Python开发人员处理CAN(控制器局域网络)总线数据。CAN总线是一种广泛用于车辆和工业应用的通信协议。python-can可以让您轻松读取和编写CAN消息。以下是几个必不可少的部分以及如何使用Python编程处理该部分。

一、Python处理CAN消息中的残留部分即残差

CAN总线可以同时传输多个数据消息。这组数据可以称作‘帧’。帧包括标识符、帧类型和数据。CAN帧也可以被传输到不同的物理环境中。CAN总线有着一个特殊的控制器来处理CAN数据消息。CAN数据消息被发送到物理介质上,当接收器看到CAN 数据它会触发一个中断,自动转到接收模式,尝试解释收到的数据。但是这些数据不能被完美地解释,有时会发生残留。残留是指在多个字节传输之间,CAN帧被分层的情况。

import can
can_interface = "vcan0"
can_bus = can.interface.Bus(can_interface, bustype="socketcan")
message = can_bus.recv()
frame_data = message.data

使用python-can读取CAN帧数据是非常直接的。如上所述,我们会从CAN总线上接收一个帧消息,然后将帧数据存储在frame_data变量里。如果帧消息包括残留,则Python中的CAN工具将其自动处理。

二、Python无法打开CAN文件,应如何处理?

当Python工具无法正常调用CAN接口时,通常表示Python运行环境中缺少必要的驱动程序。可以手动安装,或者使用工具来安装。下面是解决方法:

1.检查CAN接口及配置文件是否已正确地安装在系统中。

2.可以使用Python的‘cantools’库,它可以解析和编码CAN数据库文件。

3.在Python环境中使用Python-can library。以管理员身份运行python,运行pip install python-can指令即可下载。

4.使用CanBerry Pi运行Raspberry Pi와Python的轻量级CAN-Bus接口。Canberry Pi是一款基于Raspberry Pi的CAN总线、串口、GPIO、SPI和WiFi扩展板。

三、Python-CAN参考文献

以下列出几篇关于Python-CAN的参考文献:

Python CAN(Takuya, 2021):https://python-can.readthedocs.io/en/master/

Python for CAN(CanQueenie, 2016):http://canqueenbee.blogspot.com/2016/07/python-for-can.html

CAN模块ipython(kvaser):http://www.kvaser.com/software/7330130154024/V5_9-R6/library/docs/python-candriver/html/index.htm

四、Python-CAN参数

1. Python-CAN参数传递

下面是python-can用来打开CAN接口的参数传递方法:

import can
can_interface = "vcan0"
can_bus = can.interface.Bus(can_interface, bustype='socketcan_native')

Python-can支持多种现成的数据传输协议,这是通过参数传递方式完成的。在上面的例子中,我们指定了可以使用的总线类型为socketcan_native。

2. Python-CAN参数类型选取

python-can支持的CAN协议类型包括CANopen(使用ODVA控制),通过J1939发送以及将ISO15765报文转换为XCP报文。以下参数类型可以作为您的Python-CAN程序中的总线类型:

  • socketcan_native
  • socketcan_ctypes
  • kvaser
  • pcan
  • ixxat

3. Python-CAN参数是干什么的

参数允许您通过Python原生应用程序接收和发送CAN帧。可以控制CAN messages的多个方面,例如循环发送、处理错误、接口速度和多信道传输等。此外,参数还可以用于监视CAN总线,并调试传输。

五、Python-CAN实现餐厅服务评价

在下面的例子中,我们将使用python-can演示计算餐厅的服务评分。假设我们有两个CAN节点:180和181,分别代表餐厅服务员和顾客。餐厅服务员会在CAN总线上发送三种不同的消息,用于评估顾客的服务满意度。根据餐厅服务员发送的消息,这个程序将计算出服务质量,准确性和员工礼貌指数。以下是代码:

import can
import time

bus = can.interface.Bus(channel='can0', bustype='socketcan_native') # 第1个参数是通道,第2个参数是总线类型

#这里模拟的餐厅是服务质量评分标准,其中180是服务员,181是客户的ID;
#服务员会分别通过CAN总线发送三种不同的消息,表示三种不同的服务质量
#餐厅基于此消息计算每个服务员的服务质量得分
def quality_evaluation_worker(bus):
    serving_quality_ranking = dict()
    for msg in bus:
        if msg.arbitration_id == 0x88:
            if msg.data[0] == 0x01:
                serving_quality_ranking[str(msg.arbitration_id)] = "unacceptable"
            elif msg.data[0] == 0x02:
                serving_quality_ranking[str(msg.arbitration_id)] = "adequate"
            elif msg.data[0] == 0x03:
                serving_quality_ranking[str(msg.arbitration_id)] = "excellent"
    return serving_quality_ranking

#以下是顾客看到的评价,他们会看到平均服务评分和总体评分。
#使用180和181发送的数据,则可以计算出餐厅所有服务员的服务评价平均值
def quality_evaluation_customer(bus, quality_survey):
    service_quality_sum = 0
    for msg in bus:
        if msg.arbitration_id == 0x88:
            service_quality_sum += quality_survey[str(msg.arbitration_id)]
        else:
            pass
    average_quality = round(service_quality_sum / len(quality_survey), 2)
    print("The average quality score was: ", str(average_quality))

#主函数
if __name__ == "__main__":
    evaluation_results = quality_evaluation_worker(bus)
    quality_evaluation_customer(bus, evaluation_results)
    bus.shutdown()

在这个餐厅服务评价的例子中,我们使用socketcan_native作为总线类型,它有两个参数:通道和总线类型。

六、Python-CAN接口编程

下面以python-can通过USB连接到PCAN接口的例子来说明接口编程:

import can

print("Demo: USB-Adapter with Channel 1")
bus = can.interface.Bus(bustype='pcan', channel='PCAN_USBBUS1')

def receive_usb():
    msg = bus.recv()
    id = "{0:x}".format(msg.arbitration_id)
    data = "{0}".format(msg.data)
    print("Received message on bus1 with ID {0}: {1}".format(id, data))

print("Please send a message on USB-BUS1 (an open CAN channel)")
while True:
    receive_usb()

在这个例子中,我们开始连接到带有Python的PCAN-USB扩展的PCAN总线。然后,我们编写了一个函数来接收使用USB适配器发送的任何消息。

七、Python-CAN的用途

Python-can的应用场景非常广泛,这里列出了其中的几个:

  • 通过Python控制CAN总线以便进行数据交换、物联网集成。
  • 实现汽车业界标准的CAN网络通信。
  • 通过Python编程,进行工业自动化过程监控和相关数据分析。
  • 开发生产工艺监控和控制系统。

总之,python-can是一个非常强大且广泛使用的工具,可以让Python开发人员处理各种CAN网络通信协议。我希望在讨论了Python-CAN的这些方面之后,你可以使用python-can这个库接收和编写CAN消息,解决您各种相关的需求。