我正在编写一个每秒必须处理 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 文档,找不到有关缓冲区大小的信息。