使用python中的生成器实现多个信号共用一个帧ID发送报文的场景

基于Python实现DBC到CAPL脚本的自动化生成工具 在汽车电子开发和测试领域,CAN总线通信是核心基础技术,其通信矩阵通常由DBC文件定义,包含了报文、信号及网络节点等关键信息。基于此,工程师常使用CAPL脚本在Vector工具链中进行自动化测试和网络仿真。传统手动编写CAPL脚本存在效率低、易出错和维护成本高等问题。通过Python结合cantools库解析DBC文件,并利用Jinja2模板引擎生成CAPL代码框架,可实现从数据库到可执行脚本的自动化转换,显著提升开发效率。该技术方案尤其适用于需要快速构建基础仿真节点、实现报文周期发送和信号监控响应的场景, 阅读详情

上一篇文章:使用python中的生成器实现周期性报文发送功能。在这一篇文章中简单介绍了如何使用python的生成器概念实现提取不同信号物理量自动周期性的发送报文。

但是,上一篇文章中未考虑多个信号共用一个帧ID发送报文的场景,仅支持一个信号占用一个帧ID发送报文。基于此,优化代码结构实现多个信号共用一个帧ID发送报文的场景。

事先将待发送信号的物理量存入特定的excel模板,由于按照模板发送报文已提前确定了信号,所以可以采用事先合并报文的方式实现每帧报文的发送。

新增get_merge_item_dict()函数用于查找帧ID相同的信号,存入字典,get_merge_item_dict()函数定义如下:

    def get_merge_item_dict(self):
        # 解决多个信号共用一个报文ID发送数据的问题,真正发送的报文信号以全局变量item_list为基准
        self.merge_item_dict = dict()
        msg_id_list = []
        msg_id_idx = msg_operation_list.index("报文ID") - 1
        for item in item_list:
            msg_id = str(self.operation_dict[item][msg_id_idx])
            msg_id_list.append(msg_id)
        solo_msg_id_list = list(set(msg_id_list))
        # 以报文ID为字典的键,并入报文发送信号
        for solo_msg_id in solo_msg_id_list:
            temp_merge_list = []
            for item in item_list:
                msg_id = str(self.operation_dict[item][msg_id_idx])
                if msg_id == solo_msg_id:
                    temp_merge_list.append(item)
            self.merge_item_dict[solo_msg_id] = temp_merge_list

将上一篇文章:使用python中的生成器实现周期性报文发送功能,采用python的生成器每次执行信号的一个物理量的报文发送过程,改成先合并帧ID相同信号的报文数据再采用python的生成器每次执行同一个唯一的帧ID的一条报文数据的周期性报文发送过程。

原来采用python的生成器每次执行信号的一个物理量的报文发送过程,与python生成器概念相关的主要实现函数如下:

  def set_yield_func(self):
        item_yield_func_dict = dict()
        for i in range(len(item_list)):
            item_yield_func_dict[item_list[i]] = self.yield_item_value(i)
        return item_yield_func_dict

    def yield_item_value(self, item_idx):
        item_value_list = self.item_value_dict[item_list[item_idx]]
        for i in range(len(item_value_list)):
            yield item_value_list[i]

目前采用先合并帧ID相同信号的报文数据再采用python的生成器每次执行同一个唯一的帧ID的一条报文数据的周期性报文发送过程,与python生成器概念相关的主要实现函数如下:

    def set_yield_func_new(self):
        item_yield_func_dict = dict()
        for idx in range(len(list(self.merge_item_dict.keys()))):
            solo_msg_id = list(self.merge_item_dict.keys())[idx]
            item_yield_func_dict[solo_msg_id] = self.yield_item_msg(solo_msg_id)
        return item_yield_func_dict

    def yield_item_msg(self, solo_msg_id):
        # 生成器每次NEXT的是报文
        merge_msg_data_list = []
        merge_item_list = self.merge_item_dict[solo_msg_id]
        # 以相同帧ID的第一个报文发送信号的物理取值数组为准
        first_item_value_list = self.item_value_dict[merge_item_list[0]]
        for idx in range(len(first_item_value_list)):
            phy_value_list = []
            for item in merge_item_list:
                item_value = self.item_value_dict[item][idx]
                phy_value_list.append(item_value)
            # 合并报文
            msg_data = self.merge_msg_data(merge_item_list, phy_value_list)
            merge_msg_data_list.append(msg_data)
        for idx in range(len(merge_msg_data_list)):
            yield merge_msg_data_list[idx]
告别手动解析!用Python的cantools库5分钟搞定DBC文件,自动提取CAN信号和报文 本文介绍了如何使用Python的cantools库快速解析DBC文件,自动提取CAN信号和报文。通过详细的安装指南、基础解析方法和深度解析实战技巧,帮助开发者高效处理CAN总线通信数据,大幅提升工作效率。特别适合汽车电子和嵌入式开发领域的工程师使用。 阅读详情

相关推荐

CAN ID变周期的周期性发送实现——嵌入式BswM

首先,需要在嵌入式系统中配置CAN控制器和CAN ID的发送周期。一旦CAN控制器和CAN ID的发送周期配置完成,就可以开始周期性地发送CAN消息了。一旦CAN控制器和CAN ID的发送周期配置完成,就可以开始周期性地发送CAN消息了。根据实际需求,可以在该函数中使用CAN控制器的寄CAN ID变周期的周期性发送实现——嵌入式BswM。在这个函数中,可以将CAN ID和发送周期作为参数,将相应的配置写入相关的寄存器中。在这个函数中,可以将CAN ID和发送周期作为参数,将相应的配置写入相关的寄存器中。

CodeMaven的博客 307

C语言所谓的全局变量在多个.c文件中到底该怎样使用?

    大家应该都知道,C语言定义的变量的作用范围是从定义的位置起,到特定的时刻或位置后就被释放掉了,具体的作用范围希望大家能细心去看看,很重要,包括auto, static, const定义的变量和函数,还有malloc等函数申请的内存的使用。    那么,进入正题了,C语言所谓的全局变量在多个.c文件中到底该怎样使用?    首先说一下全局变量的特性:    全局变量可以定义在一个.c文件中,...

你爱的是技术不是钱 4万+

DBC转C代码:CAN报文解析自动生成方案与实战指南

在嵌入式开发与CAN总线通信中,DBC文件是描述报文信号格式的标准协议文本。手写解析代码不仅繁琐易错,还难以应对协议频繁变更。DBC转C代码技术通过将信号起始位、字节序(Intel/Motorola)、因子偏移等参数自动映射为结构体与解析函数,从根本上解决了手工翻译协议的痛点。该技术适用于ECU、BMS、VCU等车载控制器固件开发,也用于HIL测试与刷写工具中。掌握基于DBC的代码生成方法,可显著提升开发效率与代码可靠性,同时降低维护成本。本文完整拆解DBC解析、位提取原理、生成器架构及落地踩坑,为工程师提

weixin_34306593的博客 267

【Python】使用python通过TCP或UDP,实现收发报文数据

使用python通过TCP或UDP协议,实现收发报文数据

将冲破艾迪i的博客 1万+

Python控制PEAK CAN卡实现高精度CAN帧发送

CAN总线是汽车电子与嵌入式系统中最基础的通信协议之一,其核心在于精确的帧调度、硬件抽象与错误处理机制。本文围绕PCANBasic SDK在Python中的工程化应用展开,深入解析32位Python与PEAK官方DLL的ABI兼容性原理、ctypes结构体映射规范,以及基于time.perf_counter()的亚毫秒级定时控制技术。通过YAML驱动配置、动态数据生成(如sine/counter)、多ID轮询与ACK确认机制,显著提升ECU仿真、UDS诊断及CAN FD迁移验证等场景的调试效率与可靠性。特别

weixin_42520573的博客 249

DBC转C代码全流程实战:CAN报文解析与自动化生成指南

在CAN总线与嵌入式系统开发中,DBC文件是描述报文与信号关系的核心数据库,而将其高效转换为C代码是提升ECU固件开发效率的关键。理解DBC的BO_、SG_等结构,掌握字节序与位排列规则,是正确实现信号打包与解包的基础。通过自研代码模板或工具链,可以将DBC定义的信号批量生成为结构体及对应的打包/解包函数,实现从物理值到原始字节流的自动换算。这一技术不仅适用于AUTOSAR架构下的ECU软件实现,也广泛用于测试环境搭建、多控制器联调及版本迭代场景。合理设计生成器可有效规避字节序错乱、符号扩展遗漏等常见陷阱,

cuiji1279的博客 409

python socket 通信(发送文字、图片、文件)

本文使用 socket 来对文字、图片、文件进行通信,使其能够循环的接受和发送

牧子川的博客 1万+

DBC文件转C代码工具:解析CAN总线信号生成嵌入式代码

CAN总线作为车载网络的核心,其通信协议定义在DBC文件中。DBC文件以文本形式描述了报文ID、信号起始位、字节序、因子偏移等关键信息,是嵌入式开发中理解总线协议的基础。手动根据DBC编写C代码不仅效率低下,且容易因更新而引入错误。基于代码生成技术,可将DBC定义自动转换为C结构体、打包与拆包函数,实现协议与业务代码解耦。这一方案在车载电子开发、ECU测试等场景具有重要价值,尤其适合需要频繁迭代协议的项目。本文详细介绍了DBC文件解析的关键细节,包括Intel/Motorola字节序差异、信号位段计算、浮点

weixin_34075268的博客 403

TSMaster C脚本实现LIN报文自动发送与仿真

LIN总线作为低成本车载网络,广泛应用于车身电子节点。其单主多从架构下,主节点发送报头、从节点响应,通信依赖调度表与校验和机制。通过脚本自动化控制报文收发,可显著提升总线仿真的灵活性与测试效率,尤其适用于自动化测试、批量仿真及故障注入等场景。在TSMaster平台中,利用C脚本驱动LIN模块,能够实现主节点调度表动态调整与从节点响应数据实时生成,结合校验和匹配与状态机管理,有效应对多节点仿真中的时序与资源协调问题。

weixin_33754065的博客 327

DBC转C代码实战:CAN信号解析到嵌入式代码生成

在CAN总线嵌入式开发中,DBC文件是描述报文与信号的标准数据库格式,包含起始位、字节序、缩放因子等关键编码规则。手动将DBC翻译成C代码不仅效率低下,还容易因位序、符号扩展等细节出错。一种可行的技术思路是构建三段式流水线:先解析DBC文本生成与格式无关的中间模型,再基于该模型自动生成结构体与读写函数。这种代码生成方式将解析逻辑与输出策略解耦,便于扩展C++、Python等多种目标语言,也支持在生成前进行信号重叠校验。工具基于Python标准库实现,无第三方依赖,适合内网受限的嵌入式环境。实际产品可应用于E

weixin_31774841的博客 282

pyDDS:Python绑定到RTI的数据分发服务库

pyDDS Python绑定到RTI的数据分发服务库 要使用它,必须将DDS生成的消息类型的代码编译为共享的brary,然后使用dds.Library(path_to_so)加载它。 然后,实例化一个dds.DDS()对象并对其调用.get_topic('topic_name', lib.TypeName)以获取一个dds.Topic对象。 Topic对象具有阻塞的.send和.recv方法,您可以使用其.add_data_available_callback(func)方法设置回调。 有关阻止发送和接收的(有点费解的)示例,请参见test.py 此外, twisteddds.py提供了Twisted协议处理的仿真,并在twistedds_example.py提供了一个示例。

cantools隐藏功能挖掘:用Python批量提取arxml信号字典的3种高效方法

本文深入挖掘了Python库cantools在汽车电子领域的隐藏功能,详细介绍了三种高效方法,用于从ARXML文件中批量提取CAN信号字典。内容涵盖基础循环提取、层次化递归提取以及面向生产的自动化管道构建,并结合pandas进行数据导出,旨在帮助工程师大幅提升信号处理效率,实现自动化测试与数据分析。

ujm567890的博客 1011

python通过tcp发送xml报文的方法

今天小编就为大家分享一篇python通过tcp发送xml报文的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

TSMaster序列发送模块:汽车总线报文时序控制的自动化实践

在汽车总线开发与测试中,CAN总线通信的可靠性和时序精度直接影响ECU功能验证的结果。传统手动发送报文的方式很难满足毫秒级触发间隔和复杂逻辑顺序的要求,而周期发送又无法表达带有条件判断的交互流程。序列发送作为一种基于时间轴的报文编排机制,将触发条件、相对/绝对时间与循环逻辑整合在一起,让测试人员能够按预定剧本自动执行一组报文交互,从而精确复现偶发故障、模拟节点联动以及执行UDS诊断流程。该技术广泛应用于CAN/CANFD/LIN节点验证、故障复现和台架测试等场景,显著提升了测试的一致性与效率。本文从工程实践

weixin_33882452的博客 278

前端宝典之七:React性能优化实战精华篇

本文主要讲解实战项目中React性能优化的方法,主要分为三个大的方面:减少不必要的组件更新、组件优化以及tree-shaking,共11个方法

franktaoge的博客 1902

【CIC-IDS数据集+机器学习】实现网络流量异常检测

本项目基于CIC-IDS数据集,使用多种机器学习算法实现网络流量异常检测系统。项目采用了完整的机器学习工作流程,从数据预处理到模型部署,实现了高精度的网络入侵检测。

XiaoMu_001的博客 1936

CAN总线发送队列满错误:XL_ERR_QUEUE_IS_FULL的定位与解决

CAN总线是车载网络的核心通信协议,其可靠性取决于物理层和链路层的协同。当节点高频发送报文时,驱动层发送队列会因超过总线承载能力而溢出,产生XL_ERR_QUEUE_IS_FULL错误。理解发送链路原理、掌握总线负载估算方法,是嵌入式测试与开发人员定位此类问题的关键。通过CANalyzer的Statistics、Trace和Graphics窗口,可以直观分析负载尖峰与错误帧,结合CAPL脚本或外部程序的发送节奏优化,实现高效排障。从总线负载率估算到报文错峰调度,本文提供了一套完整的诊断与解决方案,帮助工程师

weixin_33785108的博客 526

项目方案:社会视频资源整合接入汇聚系统解决方案(五)

视频监控接入和视频汇聚平台,形成整合平台,平台服务层包括编码设备、存储设备、解码设备等的接入服务,提供基础视频服务、传输服务、存储服务、控制服务及事件服务。两种不同的接入方式:监控设备接入,是指接入社会单位视频监控系统的DVR(数字硬盘录像机)、DVS和IPC、DVR/NVR、CVR等设备;平台对接,是指对接接入社会单位数字视频监控平台。AS-VAG视频监控接入网关支持onvif、国标等接入,也支持多种SDK接入方式,包括国产的主流品牌支持海康、大华、宇视、华为等SDK,国际品牌支持松下和axis等SDK。

weixin_70208651的博客 2464

CAN报文打包解包工具:从DBC到自动生成C代码的完整实践

CAN总线是汽车电子开发的核心通信方式,ECU间的数据交换依赖对报文的打包与解析。面对上百条报文和频繁变更的协议,手动编写解析代码容易出错且维护成本极高。本文从CAN信号的基本概念出发,讲解DBC文件中字节序、缩放因子、偏移量等关键要素的原理,分析如何通过工具化自动生成结构体、打包解包函数并批量构造测试报文,从而解决字节序混乱、符号扩展缺失、MUX复用信号等工程痛点。该方法适用于整车联调、控制器测试及协议变更场景,能有效提升开发效率并降低故障排查难度。

weixin_29181861的博客 205

Android车载应用开发:Kotlin与Automotive OS深度实践

Android Automotive OS(AAOS)是Google专为车辆设计的操作系统,直接运行于车机硬件,提供完整的车载信息娱乐系统(IVI)。与Android Auto不同,AAOS允许开发者深度集成车辆硬件功能,如空调控制和传感器数据读取,同时遵循严格的驾驶安全规范。Kotlin作为开发语言,具备空安全设计、扩展函数和协程支持等优势,简化了开发流程。开发环境配置包括Android Studio、AAOS模拟器和Gradle配置,核心组件如CarAppService、Screen与模板系统,以及车辆

时小雨的专栏 3445

强化学习之课程学习法

课程学习是一种有计划的学习方法,模拟人类学习的过程。它通过设置逐步增加难度的任务序列,让学习系统从简单的任务开始,逐渐过渡到复杂任务。这一方法可以显著提高训练效率,避免智能体一开始就面临过于复杂的任务,从而导致学习过程困难。逐步难度增加:从简单的任务开始,逐步增加任务的难度,直到智能体能够解决最复杂的任务。动态调整:根据智能体的学习进展,动态调整任务的难度,保证学习的过程始终处于一个适当的挑战性范围。

m0_64087341的博客 2695

CANdb++实战:DBC文件创建与信号映射的5个关键步骤

CAN总线作为汽车电子控制单元之间的核心通信链路,其上层应用的状态与数据交互依赖于一套统一、机器可读的协议描述。DBC文件正是承担这一职责的“总线翻译器”,它把报文ID、字节序、因子偏移等信号映射关系固化下来,使CANoe等分析工具能够将原始十六进制数据还原为物理量。理解DBC的创建与校验机制,是避免信号位错乱、方向反转等隐性故障的关键,也是从事汽车电子嵌入式开发与测试工程师的基本功。本文从DBC文件的本质出发,梳理CANdb++构建DBC的完整操作路径,涵盖节点规划、报文配置、信号字节序选择、多路复用设置

weixin_34416649的博客 398

一文吃透 SAP HANA Service Broker:原理、架构与落地实践

摘要:SAP HANA Service Broker 作为云原生开发的关键组件,通过标准化流程管理 HDI 容器与服务实例的生命周期,实现数据库资源的自动化配置与安全隔离。它采用服务目录、服务计划和绑定机制,将连接凭据注入应用环境变量,避免硬编码风险。在实际应用中,需根据模块生命周期决定共享或隔离容器,并通过跨容器访问模式实现安全数据共享。典型案例展示了电商平台的多模块协同与SaaS租户隔离场景,验证了其在提升运维效率与安全合规方面的价值。最佳实践强调以生命周期划边界、最小权限原则和HTTPS安全传输,为企

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 226

Python解析阿里云物联网透传数据:从二进制帧到物模型对齐

在物联网数据采集场景中,设备常以二进制帧上报数据,如何将原始字节流转换为结构化数据是核心挑战。其原理涉及字节序解析、CRC校验和物理量换算,通过Python的struct模块可高效实现。技术价值在于提升数据可读性与业务可用性,降低云端处理负载。典型应用包括环境监测、工业设备远程运维等,需将解析结果与阿里云物联网平台物模型对齐,确保数据规范流转。Python凭借灵活性和丰富库支持,成为边缘与云端解析的首选工具,助力开发者打通从设备上报到业务应用的完整链路。

weixin_33841722的博客 237

YOLOv11训练:Roboflow免费数据集获取与格式转换超详细教程

公共数据集库:包含超过20,000个开源数据集数据标注工具:支持在线标注和团队协作数据预处理:自动增强、扩充和格式化版本控制:像管理代码一样管理数据集版本多格式导出:支持所有主流目标检测格式import cv2# 加载图像# 加载标注# 数据增强# 调整尺寸# 调整标注坐标# 转换为Tensor# 实现保持长宽比的resize逻辑pass# 坐标转换逻辑pass# 数据增强实现pass数据集选择优先选择Roboflow上标注质量高的官方数据集。

weixin_39818775的博客 2362

STM32cubemx配置驱动DHT11模块

本篇文章将带大家学习使用DHT11湿温度模块,使用这个模块可以获取当前的温度和湿度数据。DHT11可以用于智能家居,蔬菜大棚等项目当中适用范围广。DHT11 是一种数字式温湿度传感器,由杜邦公司推出。它可以测量环境中的温度和湿度,并将测量结果以数字形式传输给微控制器或其他电子设备,适用于通过数字信号读取环境温湿度的应用场景。DHT11 传感器使用单总线数据交换协议,可以通过一个 I/O 引脚进行控制和数据传输。

m0_49476241的博客 5912
上一篇: 【文献研究】轴辐式航线网络设计—Liner hub-and-spoke shipping network design
下一篇: 【学习篇】SAE J1939协议—常用到的知识点
草莓仙生
博客等级 码龄8年 2033粉丝 224原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草莓仙生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值