PyQT5+Pycharm编写一个简单的串口上位机

最近开始学习python,还是去年暑假看过一些python语法,至今忘的差不多了,初中的时候学过e语言,当时初中制作些单机外挂之类(cf也做过,呃就是被封号了),最近玩的嵌入式有时候需要用到上位机,之前都是通过e语言做的,总觉得拿不出手,便想着换一个语言写一个上的了台面的
综合考虑,选择的pyqt5来编写上位机(因为python方便些嘛)
话不多说,正文开始:
(1)pycharm的安装
下载连接:http://www.jetbrains.com/pycharm/download/#section=windows
在这里我选择的是win10版本的pycharm,大家根据系统自行选择,安装过程就不在赘述了。
(2)pyqt5的安装
这个我搜索的时候大家都使用的是pip的方式安装,在这的话我推荐通过pycharm来安装,比较方便些。
输入pyqt5后选择install即可
(3)designer.exe的使用(画界面)
打开designer开始绘制我们的界面:
绘制完成后由ui文件生成py文件,此时就可以开始编写代码了
(4)编写程序
新建一个py文件,我使用的名称为demo.py
先引入需要使用的库
import sysimport serialimport reimport binasciiimport _threadimport timeimport serial.tools.list_portsfrom ui1 import ui_mainwindowfrom pyqt5 import qtwidgets 此时我们开始编写main函数,将窗口显示出来,在这里我是选择了一个继承类,来继承通过pyqt5绘制的界面
class pc_software(qtwidgets.qmainwindow,ui_mainwindow):
def __init__(self): super(pc_software,self).__init__() self.setupui(self) if __name__ == '__main__': app = qtwidgets.qapplication(sys.argv) myshow = pc_software() myshow.show() sys.exit(app.exec_()) 此时可以正常显示界面,但是没有功能,在pc_software下添加些其它函数
class pc_software(qtwidgets.qmainwindow,ui_mainwindow): def __init__(self): super(pc_software,self).__init__() self.setupui(self) self.ser = serial.serial() self.ser.baudrate = 9600 self.ser.bytesize = 8 # 设置数据位 self.ser.stopbits = 1 # 设置停止位 self.ser.parity = n # 设置校验位 self.pushbutton_4.clicked.connect(self.clear_text) self.pushbutton.clicked.connect(self.screach_com) self.pushbutton_2.clicked.connect(self.clink_com) self.pushbutton_3.clicked.connect(self.data_send) self.screach_com() def clear_text(self): self.textedit.clear() self.textbrowser.clear() def screach_com(self): self.combobox.clear() port_list = list(serial.tools.list_ports.comports()) com_numbers = len(port_list) p1 = re.compile(r'[(](.*?)[)]', re.s) for i in range(com_numbers): com_list = str(port_list[i]) com_name = re.findall(p1, com_list) com_name = str(com_name) strlist = com_name.split(') self.combobox.additem(strlist[1]) def clink_com(self): self.ser.port = self.combobox.currenttext() if self.ser.is_open == true : self.ser.close() self.pushbutton_2.settext('打开串口') else: self.ser.open() self.pushbutton_2.settext('关闭串口') def data_send(self): if self.ser.is_open == true: self.ser.write((self.textedit.toplaintext()+'rn').encode('gbk')) #self.ser.write(str(binascii.b2a_hex(self.textedit.toplaintext()))) #尝试编写hex发送—失败 def data_recive(self): while true: if self.ser.is_open == true: self.rc_data = self.ser.read_all() if self.rc_data != b'': #print('receive',self.rc_data.decode(gbk)) self.textbrowser.insertplaintext(self.rc_data.decode(utf-8)) self.textbrowser.movecursor(self.textbrowser.textcursor().end) # 文本框显示到底部 分别实现串口扫描、清空接收、打开/关闭串口、发送数据以及多线程的接收功能。
此时在主函数里面创建线程
_thread.start_new_thread(myshow.data_recive,()) 此时运行一下程序并验证功能,发现ok
(5)遇到的问题
首先遇到的问题是无法再另一个文件里面使用其它的槽和对应函数,经过多个群里面的大佬检测后语句没有问题,最后发现是在主函数里面的映射有问题。(更深入了解了python语法的映射关系)
第二个问题是在使用serial库时的发送部分的转码,后来通过encode(gbk)来解决
第三个问题是接受部分,因为打开串口后要时刻准备接收,初始是使用了while true来实现试试监听,后来发现这样程序根本无法运行(无法进入界面),后来通过搜索,以线程的方式实现了互不干扰的实时监听。(python3里thread的库名称更改成了_thread)


华硕ZenBook 3 Deluxe体验评测:让苹果MacBook Pro有压力的超薄笔记本
高频下保持高输出阻抗的双极电流源
RF430CL330H NFC4接口应答器的作用介绍
LED电源倍压电路
锂离子电池极片残留水分测试及其对性能的影响
PyQT5+Pycharm编写一个简单的串口上位机
空调行业进入淡季市场需求萎靡,行业价格竞争激烈
中国被“卡脖子”的芯片产业过去三年改变了什么?
新增眼球追踪技术 三星galaxy s3将重新命名
创略科技获7100万元B轮融资,饿了么、沃尔玛均是客户
华为奖金高BAT奖金也不低,前提是你得学会这些
创新的传感器技术将在我们的生活中应用越来越广泛
疫情和5G驱动转型加速,华为GTS与GDE平台助力运营商发展
一文详解PPLN晶体基本应用
1~3W LED手电筒驱动器
前特斯拉技术专家谷俊丽加盟小鹏汽车出任自动驾驶研发副总裁
MAX16055超小尺寸的微处理器监控电路,监控多达6路监测电压
微软Surface Pro5外部改为新的充电接口,内部硬件升级为Kaby Lake
2400人……又一汽车巨头宣布裁员,子公司9名高管被解雇!
如何用不同方法验证单片机变量的大小呢?