使用python中的生成器实现周期性报文发送功能
创始人
2024-05-29 09:12:32
0

使用python中的生成器实现周期性发送列表中数值的报文发送功能。

功能开发背景:提取cantest工具采集到的现场报文数据,希望使用原始的现场数据模拟验证程序现有逻辑,需要开发一个工具能够自动按照报文发送周期依次发送采集到的报文数据中的一个数值。

功能开发需求:多个报文发送对象共用同一个报文发送线程,多个对象间的报文发送周期不同,多个对象间的总报文发送数据长度不同,能够允许报文发送过程中断及恢复某个对象的报文发送。

功能开发实现逻辑:在固定发送对象某个数值的基础程序版本上增加新的功能,考虑使用python中生成器实现周期性提取对象数值发送报文的功能。

目前只需要发送两个对象的报文数据,先定义两个使用yield生成器:

    def yield_item_value_1(self):item_value_list = self.item_value_dict[item_list[0]]for i in range(len(item_value_list)):yield item_value_list[i]def yield_item_value_2(self):item_value_list = self.item_value_dict[item_list[1]]for i in range(len(item_value_list)):yield item_value_list[i]

报文发送线程中的run()函数:

    def run(self):# 实时更新item的被选状态self.get_checkbox_res_func()# 获取每个对象的实际物理值self.get_item_value_dict()self.item1_value_func = self.yield_item_value_1()self.item2_value_func = self.yield_item_value_2()while self.Flag:if any(msg_send_flag_dict.values()):# 每隔second秒执行func函数timer = Timer(0.01, self.tick_10ms_func)timer.start()self.send_working_msg(self.working_can_device, self.working_can_channel)timer.join()else:mes_info = "Goodbye *** 自动发送所有报文数据结束!!!"toastone = wx.MessageDialog(None, mes_info, "信息提示",wx.YES_DEFAULT | wx.ICON_QUESTION)if toastone.ShowModal() == wx.ID_YES:  # 如果点击了提示框的确定按钮toastone.Destroy()  # 则关闭提示框break

报文周期性发送函数:

    def send_working_msg(self, can_device, device_id):for idx in range(len(item_list)):if msg_send_flag_dict[item_list[idx]] == 1:msg_id_idx = msg_operation_list.index("报文ID") - 1msg_id = eval(str(self.operation_dict[item_list[idx]][msg_id_idx]).strip())# 获取报文发送帧类型msg_type_idx = msg_operation_list.index("帧类型") - 1msg_type = str(self.operation_dict[item_list[idx]][msg_type_idx])msg_type = 1 if msg_type == "扩展帧" else 0# 获取报文发送周期msg_cycle_idx = msg_operation_list.index("周期(ms)") - 1msg_cycle = int(self.operation_dict[item_list[idx]][msg_cycle_idx])send_cycle = msg_cycle / 10if msg_tick_10ms_dict["_".join(["tick", "10ms", str(idx)])] >= send_cycle:# 开始喂值if idx == 0:try:item_phyValue = next(self.item1_value_func)except StopIteration:msg_send_flag_dict[item_list[idx]] = 0continueelse:try:item_phyValue = next(self.item2_value_func)except StopIteration:msg_send_flag_dict[item_list[idx]] = 0continuemsg_data = self.get_item_msg(item_list[idx], item_phyValue)if send_msg(msg_id, msg_type, msg_data, can_device, device_id, 0):print("发送报文成功")# print("msg_data", msg_data)msg_tick_10ms_dict["_".join(["tick", "10ms", str(idx)])] = 0else:pass# print("发送报文失败")# mes_info = "发送报文失败"# toastone = wx.MessageDialog(None, mes_info, "信息提示",#                             wx.YES_DEFAULT | wx.ICON_QUESTION)# if toastone.ShowModal() == wx.ID_YES:  # 如果点击了提示框的确定按钮#     toastone.Destroy()  # 则关闭提示框

功能实现逻辑的待优化点:存在多个对象就需要定义多个存储报文数据的生成器。

上述功能实现逻辑优化如下:

    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_dictdef 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]

报文发送线程的run()函数中调用这个存储对象报文发送数据生成器的字典item_yield_func_dict:

    def run(self):# 实时更新item的被选状态self.get_checkbox_res_func()# 获取每个对象的实际物理值self.get_item_value_dict()self.item_yield_func_dict = self.set_yield_func()…………

从存储每个对象生成器的字典item_yield_func_dict中获取生成器对象:

                    try:item_phyValue = next(self.item_yield_func_dict[item_list[idx]])except StopIteration:msg_send_flag_dict[item_list[idx]] = 0continue

相关内容

热门资讯

我的中国梦作文600字初一(... 我的中国梦作文600字初一 篇一我的中国梦作为一个中国人,我有着自己的中国梦。中国梦,是每个中国人对...
我的年度关键词旅游作文【实用... 我的年度关键词旅游作文 篇一我今年的关键词是“自然”,因此我选择去探索大自然的奇妙之处。我决定去一座...
你好初一优秀作文49篇(优秀... 你好初一优秀作文49篇 篇一初中生活的收获与感悟初中三年的时光匆匆而过,回首看来,这三年是我成长最快...
哑剧表演初一作文【最新6篇】 哑剧表演初一作文 篇一哑剧表演初一作文 篇一哑剧表演是一种没有语言交流的表演形式,通过动作、表情和肢...
薄雾浓云愁永昼散文(优质3篇... 薄雾浓云愁永昼散文 篇一薄雾浓云愁永昼在这个美丽的季节里,我站在山顶俯瞰着整个城市。薄雾弥漫,浓云滚...
初中记叙类作文600字【经典... 篇一:初中记叙类作文600字一次难忘的旅行那是我初中时期的一个寒假,我和家人决定去一个陌生的城市旅行...
我的初中老师作文500字(精... 我的初中老师作文500字 篇一初中时期是我人生中最重要的阶段之一,而我的初中老师也是我成长过程中的重...
优秀作文初一 优秀作文初一(精选38篇)  在日常学习、工作抑或是生活中,大家都尝试过写作文吧,作文是通过文字来表...
聊一聊那些快乐的往事初中作文... 聊一聊那些快乐的往事初中作文 篇一初中时光,是我生命中最美好的一段时光。在这段时间里,我经历了许多快...
初中校园生活作文(经典6篇) 初中校园生活作文 篇一:我的初中校园生活初中校园生活是我人生中最难忘的一段时光。在这里,我度过了三年...
盲人的世界初中生作文(最新5... 盲人的世界初中生作文 篇一盲人的世界盲人是指那些失去了视力的人。他们无法感受到周围的光线和颜色,无法...
初一感动的作文600字【优秀... 初一感动的作文600字 篇一初一是一个充满新奇和挑战的年纪。在这一年里,我经历了许多感动和感慨,其中...
爸爸我想对你说,谢谢初一作文... 爸爸我想对你说,谢谢初一作文 篇一亲爱的爸爸,写这篇作文的时候,我突然想到了很多要对你说的话。首先,...
老报纸初一作文(经典5篇) 老报纸初一作文 篇一:回顾过去的故事随着时间的推移,科技的进步,我们渐渐对老报纸失去了兴趣。然而,老...
食事作文800字【经典6篇】 食事作文800字 篇一:美食之旅食物是人类生活中不可或缺的一部分,不仅是生存的基本需求,更是一种享受...
师生之间作文【推荐5篇】 师生之间作文 篇一师生关系的重要性师生关系是教育中不可或缺的一环。一个良好的师生关系不仅可以提高学生...
《成长的烦恼》初中作文600... 《成长的烦恼》初中作文600字 篇一成长是一段充满烦恼的旅程。在我们的成长过程中,我们会遇到各种各样...
初一的幸福作文400字【精简... 初一的幸福作文400字 篇一初一的幸福初一,是每个学生心中的一个重要的节点。对于我来说,初一代表着新...
雨心-初中作文500字【经典... 雨心-初中作文500字 篇一雨心雨心是一个乡村小女孩的名字,她生活在一个风景秀丽的山村。雨心是个聪明...
初一买书作文1000字【通用... 初一买书作文1000字 篇一 初一买书作文1000字 篇二初一买书作文1000字 篇三今天是周天,明...