news 2026/7/7 7:29:49

树莓派CAN(FD) 测试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
树莓派CAN(FD) 测试

双向压力测试

#!/usr/bin/env python3# -*- coding: utf-8 -*-importosimporttimeimportsocketimportstructimportselectimportthreadingimportsubprocessimportargparse# ===== CAN 常量 =====SOL_CAN_RAW=getattr(socket,"SOL_CAN_RAW",101)CAN_RAW_FILTER=getattr(socket,"CAN_RAW_FILTER",1)CAN_RAW_LOOPBACK=getattr(socket,"CAN_RAW_LOOPBACK",3)CAN_RAW_RECV_OWN_MSGS=getattr(socket,"CAN_RAW_RECV_OWN_MSGS",4)CAN_ECHO_FLAG=0x20000000STD_MASK=0x7FFCAN_ID=0x123PAYLOAD=bytes([0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88])CAN_FRAME_FMT="=IB3x8s"# can_id, dlc, pad, data# ===== 工具函数 =====defrun(cmd):subprocess.run(cmd,shell=True,stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL)defsetup_can():run("sudo ifconfig can0 down")run("sudo ifconfig can1 down")run("sudo ip link set can0 up type can bitrate 1000000")run("sudo ip link set can1 up type can bitrate 1000000 dbitrate 1000000 restart-ms 1000 berr-reporting on fd on")run("sudo ifconfig can0 txqueuelen 65536")run("sudo ifconfig can1 txqueuelen 65536")defopen_can(iface,is_tx):s=socket.socket(socket.AF_CAN,socket.SOCK_RAW,socket.CAN_RAW)s.bind((iface,))flt=struct.pack("=II",CAN_ID,STD_MASK)s.setsockopt(SOL_CAN_RAW,CAN_RAW_FILTER,flt)ifis_tx:s.setsockopt(SOL_CAN_RAW,CAN_RAW_LOOPBACK,0)else:s.setsockopt(SOL_CAN_RAW,CAN_RAW_RECV_OWN_MSGS,0)returnsdefpack_frame():returnstruct.pack(CAN_FRAME_FMT,CAN_ID,8,PAYLOAD)deffmt_frame():return"ID=0x123 DATA=11 22 33 44 55 66 77 88"# ===== 发送线程 =====defsend_loop(sock,rate,end_t,stat,key,tag):interval=1.0/rate next_t=time.perf_counter()frame=pack_frame()printed=Falsewhiletime.perf_counter()<end_t:now=time.perf_counter()ifnow<next_t:time.sleep(min(0.0005,next_t-now))continuetry:sock.send(frame)stat[key]+=1ifnotprinted:print(f"[{tag}TX OK]{fmt_frame()}")printed=TrueexceptOSError:passnext_t+=interval# ===== 接收线程 =====defrecv_loop(sock,end_t,stat,key,tag):printed=Falsewhiletime.perf_counter()<end_t:r,_,_=select.select([sock],[],[],0.05)ifnotr:continueframe=sock.recv(16)can_id,dlc,data=struct.unpack(CAN_FRAME_FMT,frame)ifcan_id&CAN_ECHO_FLAG:continueif(can_id&STD_MASK)==CAN_IDanddata[:8]==PAYLOAD:stat[key]+=1ifnotprinted:print(f"[{tag}RX OK]{fmt_frame()}")printed=True# ===== 主程序 =====defmain():parser=argparse.ArgumentParser()parser.add_argument("--no-setup",action="store_true",help="跳过 can 配置")parser.add_argument("--duration",type=float,default=3.0,help="每档测试秒数")parser.add_argument("--rates",default="10,50,100,200,500,1000,2000,3000,4000,5000")args=parser.parse_args()ifnotargs.no_setup:setup_can()tx0=open_can("can0",True)tx1=open_can("can1",True)rx0=open_can("can0",False)rx1=open_can("can1",False)rates=[int(x)forxinargs.rates.split(",")]print("\n=== CAN0 <-> CAN1 双向收发测试 ===")print("ID=0x123 DATA=11 22 33 44 55 66 77 88\n")print("rate(Hz) | can0->can1 sent/recv drop% | can1->can0 sent/recv drop%")forrateinrates:stat={"s0":0,"r1":0,"s1":0,"r0":0}start=time.perf_counter()send_end=start+args.duration recv_end=send_end+0.5ts0=threading.Thread(target=send_loop,args=(tx0,rate,send_end,stat,"s0","can0"))ts1=threading.Thread(target=send_loop,args=(tx1,rate,send_end,stat,"s1","can1"))tr0=threading.Thread(target=recv_loop,args=(rx0,recv_end,stat,"r0","can0"))tr1=threading.Thread(target=recv_loop,args=(rx1,recv_end,stat,"r1","can1"))tr0.start();tr1.start()ts0.start();ts1.start()ts0.join();ts1.join()tr0.join();tr1.join()d01=0ifstat["s0"]==0else(stat["s0"]-stat["r1"])/stat["s0"]*100d10=0ifstat["s1"]==0else(stat["s1"]-stat["r0"])/stat["s1"]*100print(f"{rate:7d}|{stat['s0']:5d}/{stat['r1']:5d}{d01:6.2f}%"f" |{stat['s1']:5d}/{stat['r0']:5d}{d10:6.2f}%")ifd01>1ord10>1:print(">> 已明显开始丢包,再提速意义不大了")breakprint("\n=== 测试结束 ===")if__name__=="__main__":ifos.geteuid()!=0:print("请 sudo 运行")exit(1)main()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 22:19:14

【VSCode】设置中文、多标签设置 ( 设置显示语言 | 批量打开标签 | 标签栏切换 )

文章目录一、设置中文1、下载中文扩展包2、设置显示语言3、重置语言包4、清除缓存二、多标签设置1、批量打开标签2、标签栏切换3、标签页管理4、分屏 / 分栏查看多个标签一、设置中文 1、下载中文扩展包 按照 【开发环境】Ubuntu 中使用 VSCode 开发 C/C ① ( 安装中文扩展 | 安…

作者头像 李华
网站建设 2026/7/7 16:45:42

回收欧姆龙PLC,传感器

欧姆龙&#xff08;OMRON&#xff09;是知名的日本自动化品牌&#xff0c;以卓越的传感与控制技术闻名于世。其产品线全面&#xff0c;涵盖工业自动化各核心领域&#xff0c;在精密制造、设备控制与节能方面表现出色。 热门型号示例&#xff1a;PLC&#xff1a; CP1E&#xf…

作者头像 李华
网站建设 2026/7/7 18:42:04

数据结构期末复习:数组核心操作全解析(含代码实现与复杂度分析)

数据结构期末复习&#xff1a;数组核心操作全解析&#xff08;含代码实现与复杂度分析&#xff09;前言 在数据结构期末考试中&#xff0c;数组作为最基础、最常考的数据结构之一&#xff0c;其核心操作是高频考点。本文系统梳理了五大经典数组操作题型——合并、交并集、拆分、…

作者头像 李华
网站建设 2026/7/7 18:21:41

【完整源码+数据集+部署教程】动物检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

一、背景意义 随着计算机视觉技术的迅猛发展&#xff0c;物体检测在各个领域的应用越来越广泛&#xff0c;尤其是在动物检测方面。动物检测不仅对生态保护、野生动物监测、宠物管理等领域具有重要意义&#xff0c;同时也为人们提供了更为智能化的生活方式。近年来&#xff0c;Y…

作者头像 李华
网站建设 2026/7/7 2:21:31

告别楼梯设计“磨人”细节!浩辰AI让效率与安全兼得

设计部的张工&#xff0c;又一次在楼梯图纸前陷入了沉思。空间尺寸复核、梯步计算、反复检查碰头高度……这些“磨人”的细节&#xff0c;不仅耗时费力&#xff0c;更关乎最终的建筑安全。能否有一个“智慧外脑”&#xff0c;让设计师从重复劳动中解放&#xff0c;专注于真正的…

作者头像 李华
网站建设 2026/7/7 20:05:24

Macleod中优化与合成

完全自动化的设计和制造&#xff0c;所需要的只是一个规格要求和一个开始按钮&#xff0c;但是到目前为止&#xff0c;实现这个目标还有一段路要走。对于光学薄膜的设计&#xff0c;我们仍然需要从业人员丰富的技能和经验。好消息是&#xff0c;Macleod强大的优化与合成技术可以…

作者头像 李华