我在python(pcanbasicapi)中使用canbus,希望它更易于使用。在
许多设备通过总线连接。他们都被允许发送数据,如果发生碰撞,最低的ID将获胜。在
数据以ID、SubID、hexvalues的帧组织
为了说明我试图解决的问题,想象一个信号的振幅。在
读取帧发送到的值问题ID问题子ID问题数据
如果没有优先级更高的消息(=lowerID),则答案将写入总线:答案ID答案子ID答案数据
由于任何模块/设备都可以写入总线,因此您不知道下一个将得到哪个答案。设置值也是一样的,只是使用不同的ID。因此,对于上述示例,振幅将具有:4与读/写问题/答案相关的ID和子ID
此外,必须指定/存储数据的长度has(0-8)。在
由于数据都是十六进制值,因此必须指定解析器以获得人类可读的值(例如十进制表示的电压)
为了存储这些信息,我使用嵌套dict:parameters = {'Parameter_1': {'Read': {'question_ID': ID,
'question_SUBID': SubID,
'question_Data': hex_value_list,
'answer_ID': ...,
'answer_subID': ...,
'answer_parser': function},
'Write': {'ID': ...,
'SubID': ...,
'parser' ...,
'answer_ID': ...,
'answer_subID': ...}},
'Parameter_2': ... }}
有很多工具可以显示在什么时候设置了哪个值,但是对于硬件控制来说,只要参数表是最新的,它们的读取顺序就不相关了。因此,可能解决方案的一部分是将整个流量存储在dict的dict中:
^{pr2}$
由于总线的性质,我得到了许多其他设备询问的答案-总线相当满-这些不应该被忽略,因为它们可能是我下一步需要的值,并且没有必要创建额外的流量-我可能会使用带有到期日的时间戳,但到目前为止,我并没有考虑太多。在
这很管用,但用起来很糟糕。一般来说,我大概有300个参数。最终目标是通过一个(pyqt)Gui来控制设备,读取一些诸如序列号之类的值,同时运行测量任务。在
因此,最大的问题是如何定义一个更易于访问和理解的更好的数据结构?我期待任何关于干净设计的建议。在
主要目标将是类似于删除整个基于消息的方法。在
编辑:我的目标是消除整个基于CAN的特定消息的方法:
我想我需要一个线程来进行通信,它应该:读取缓冲区并更新我的变量
发送请求(消息)以获取其他值/变量
定期发送一些值
因此,通过gui,我希望能够:按名称获取参数-->发送带有参数名称的字符串
设置参数signal-->;str(name),value(在gui中显示)
定期获取值-->;名称、间隔、持续时间(10秒或无限)
线程必须:在总线上记录所有数据以备内部存储
通过从名称、值和读取生成消息来处理请求,直到获得结果
发送周期性信号
我想要一个实际硬件的设计理念:我想到的解决方案是上面的参数
对于内部存储,我考虑了总线数据
但我不知道如何:将数据从总线线程传递到gui(所有值vs.新值/请求值)
如何用pyqt中的信号和插槽实现它
在内部存储数据(dict的dict或一些新的更好的想法)
如果这个设计是个不错的选择