使用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

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...