【问题标题】:linux CAN protocol maximum ratelinux CAN协议最大速率
【发布时间】:2021-03-17 12:45:15
【问题描述】:

我正在编写一个每秒必须处理 20000 条 CAN 消息的程序。在linux下使用socketcan用python写代码的时候,好像msg_per_second超过200就开始丢消息了。

什么是限制因素?如何修改程序或操作系统设置以避免丢失 CAN 消息?

下面的代码显示当 msg_per_second 为 1000 时的计数约为 990。它们应该相等。

#!/usr/bin/env python3

import time
import can 
import datetime

count = 0
count_print_time = datetime.datetime.now()

bus = can.Bus(interface='socketcan', channel='vcan0', bitrate=500000)
msg = can.Message(arbitration_id=0x123, data=[1, 2, 3, 4, 5, 6], is_extended_id=True)
msg_per_second = 1000
period = 1 / msg_per_second
bus.send_periodic(msg, period)

while(True):
    bus.recv(timeout=None)
    count = count + 1

    time_elapsed = datetime.datetime.now() - count_print_time

    if time_elapsed.total_seconds() >= 1:
        count_print_time = datetime.datetime.now()
        print(f"count : {count}")
        count = 0

输出:

计数:989 计数:988 计数:988 计数:990 计数:990 计数:990 计数:990

我的问题可能与接收缓冲区大小有关。当我运行以下代码时,我总是会阅读 278 条消息:

import can

count = 0

bus1 = can.Bus(interface='socketcan', channel='vcan0', bitrate=500000)
bus2 = can.Bus(interface='socketcan', channel='vcan0', bitrate=500000)

for i in range(1000):
    msg = can.Message(arbitration_id=i, data=[1, 2, 3, 4, 5, 6], is_extended_id=True)
    bus1.send(msg)

while(True):
    msg = bus2.recv(timeout=None)
    count = count + 1
    print(f"count: {count}") 

输出: 计数:1 计数:2 ... 数量:277 计数:278

我查看了 socketcan 文档,但找不到有关缓冲区大小的信息。

【问题讨论】:

  • 打印period的值 - 是0吗?你在做整数运算。
  • @barny 这是 Python 3,默认情况下进行真正的除法,而不是整数除法。
  • 我尝试使用 sock1.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF),它显示缓冲区大小为 212992。使用 setsockopt 更改此值不会以任何方式改变程序的行为。
  • 天哪,我没有通过那个面试问题:-(
  • 如果您尝试以 500.000 位/秒的比特率接收每秒 20.000 个 CAN 帧,则每帧最多有 25 位。可能的最小 CAN 帧(11 位标识符,无负载)至少为 47 位。 20.000 帧/秒在理论上可能适用于 1 Mbit/秒,但在实践中却不行,即使 SocketCAN+python-can 开销可以忽略不计,

标签: python linux can-bus socketcan python-can


【解决方案1】:

对 recv() 函数进行计时,执行时间为 800 到 1200 us。使用 1200us 时,最大接收速率为每秒 833 条消息。

如果接收处理时间超过发送处理时间,消息可能会在缓冲区中堆积,最终在缓冲区满时被丢弃。

我还没有找到增加缓冲区大小的方法。第二个代码 sn-p 总是给我最后的 278 条消息。其余消息将被丢弃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多