上次我最终做出了一个简易的串口助手,其效果如下:
但在反复运行多次之后,发现了很多小毛病,接下来一一列举并改正:
1.在电脑未接入设备的时候,程序运行会报错无法运行:
问题在哪里呢相信你看到这个错误提示应该能立马想到是哪里了,问题正出在下面这几行?
ListPorts = list(serial.tools.list_ports.comports())
Port_list['values'] = [i[0] for i in ListPorts]
Port_list.current(0)
当电脑没接入任何设备的时候,ListPorts读回来的是一个空表,里边此时没有元素。因此当运行到Port_list.current(0)时,自然会报错,此时是个空表,怎么显示表中第一个元素?为了解决这个问题,我们需要加一个判断表是否为空的判断,来避免程序在未接入设备的时候无法运行。为了提醒使用者当前是否接入设备,我决定再加一个扫描端口按钮,用以检测是否有设备接入扫描按钮触发的函数如下:
def scan_serial():
global ListPorts
ListPorts = list(serial.tools.list_ports.comports())
if ListPorts:
Information_Window.insert("end", '请选择端口' + '\n')
Information_Window.see("end")
Port_list['values'] = [i[0] for i in ListPorts]
Port_list.current(0)
else:
Port_list['values'] = [" "]
Port_list.current(0)
Information_Window.insert("end", '无可用端口' + '\n')
Information_Window.see("end")
这样在电脑未接入设备的时候程序便可以运行,运行效果如下:
此时按一下扫描端口按钮,操作信息窗口便会显示“无可用端口”,同时串口号后面为空白。当接入设备后再按下扫描端口,此时串口号后面便可以出现当前所有设备的端口号,接下来选择正确的端口号后,按下开始采集便可开始采集数据,这个问题便解决了效果如下!
2.解决了上一个问题之后,我又手残反复运行了几次,又发现了个问题。操作信息窗口和接收区窗口由于使用的默认参数,导致它俩变成了可以外部输入的文本框。没错,鼠标一点便会有光标出现,你可以直接输入任何内容,即使接收区正在采集数据你也可以直接鼠标点击,出现光标之后就可以插入任何内容了。不仅如此,你还可以直接删除窗口里的任何内容效果如下:
这怎么能忍我需要把这两个窗口设置为只读属性,不允许外部修改这样一来便可以解决问题查一下文字的选项参数表,找到了这个设置!。:
没错,将这两个窗口的状态属性设置为DISABLED即可。但是注意后面,设置为DISABLED时,无法修改里面内容,意思就是此时你程序也无法向里边插入内容,这两个窗口会一直保持空白,无论外部或是程序输入任何内容都没反应。所以,应对的办法就是程序需要插入内容时将窗口属性改为师范大学,其余时间始终保持禁用属性!然而强迫症的我紧接着发现窗口在插入内容的时候会有光标在那里闪闪闪,关不掉看着很难受。思考了几秒钟之后,我把光标颜色改成了白色,这样窗口就干净了。使用了insertbackground这个参数设置。
相关程序写法如下:
Information_Window.configure(insertbackground='white') # 操作信息窗口光标颜色设为白色
Information_Window.configure(state='disabled') # 操作信息窗口属性设为disabled
Information_Window.configure(state='normal') # 操作信息窗口属性设为normal
Receive_Window.configure(insertbackground='white')
Receive_Window.configure(state='disabled')
Receive_Window.configure(state='normal')
解决了以上两个问题后,串口助手的功能和界面得到了进一步完善。于是我便在此基础上进行实际的GUI的改造。
实际GUI的要求如下:
1.采集卡共有八个通道,需要有八个窗口来分开显示采集的数据
2.不需要向设备发送的功能,只需可以采集数据即可
这样一来我的布局便需要大改了,我大概设计了一下布局。
经过简单的修改代码后,我将布局成功的实现了出来。
接下来只需要解决接收数据这一块即可完成任务。采集卡使用的Modbus协议的RTU方式传输数据,在查阅了的Modbus协议的基础知识和使用专用的测试工具后,我们了解了采集卡的数据帧格式,弄明白通道地址和返回数据格式后,我们选择了的Python里的MinimalModbus这个库,通过依次读取八个通道的数据,在前面加上时间戳并将其转换格式显示在各自的窗口后,我们最终实现了GUI的要求的全部功能。
时间怎么加呢,很简单,一句代码就可以解决:
time.strftime("%H:%M:%S>>", time.localtime())
当然还可以显示年月日等其他内容,只是我的窗口显示不下了就没加了。
至此,GUI所有功能全部实现!有哪里不懂得可以评论问我哟。