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

文章讲述了如何优化Python生成器,以处理多个信号共用一个帧ID发送报文的场景。通过读取Excel模板,合并相同帧ID的信号报文,并利用生成器按周期发送合并后的报文数据。主要涉及get_merge_item_dict()和set_yield_func_new()等函数的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇文章:使用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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

草莓仙生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值