最近開始學習python,還是去年暑假看過一些python語法,至今忘的差不多了,初中的時候?qū)W過E語言,當時初中制作些單機外掛之類(CF也做過,呃就是被封號了),最近玩的嵌入式有時候需要用到上位機,之前都是通過E語言做的,總覺得拿不出手,便想著換一個語言寫一個上的了臺面的
綜合考慮,選擇的PyQt5來編寫上位機(因為python方便些嘛)
話不多說,正文開始:
(1)pycharm的安裝
下載連接:http://www.jetbrains.com/pycharm/download/#section=windows
在這里我選擇的是win10版本的pycharm,大家根據(jù)系統(tǒng)自行選擇,安裝過程就不在贅述了。
(2)PyQt5的安裝
這個我搜索的時候大家都使用的是pip的方式安裝,在這的話我推薦通過Pycharm來安裝,比較方便些。
輸入pyqt5后選擇Install即可
(3)Designer.exe的使用(畫界面)
打開designer開始繪制我們的界面:
繪制完成后由UI文件生成PY文件,此時就可以開始編寫代碼了
(4)編寫程序
新建一個PY文件,我使用的名稱為demo.py
先引入需要使用的庫
import sys import serial import re import binascii import _thread import time import serial.tools.list_ports from UI1 import Ui_MainWindow from PyQt5 import QtWidgets
此時我們開始編寫"MAIN"函數(shù),將窗口顯示出來,在這里我是選擇了一個繼承類,來繼承通過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下添加些其它函數(shù)
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 # 設(shè)置數(shù)據(jù)位 self.ser.stopbits = 1 # 設(shè)置停止位 self.ser.parity = "N" # 設(shè)置校驗位 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('關(guān)閉串口') 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發(fā)送—失敗 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) # 文本框顯示到底部
分別實現(xiàn)串口掃描、清空接收、打開/關(guān)閉串口、發(fā)送數(shù)據(jù)以及多線程的接收功能。
此時在主函數(shù)里面創(chuàng)建線程
_thread.start_new_thread(myshow.Data_Recive,())
此時運行一下程序并驗證功能,發(fā)現(xiàn)OK
(5)遇到的問題
首先遇到的問題是無法再另一個文件里面使用其它的槽和對應(yīng)函數(shù),經(jīng)過多個群里面的大佬檢測后語句沒有問題,最后發(fā)現(xiàn)是在主函數(shù)里面的映射有問題。(更深入了解了python語法的映射關(guān)系)
第二個問題是在使用serial庫時的發(fā)送部分的轉(zhuǎn)碼,后來通過encode("GBK")來解決
第三個問題是接受部分,因為打開串口后要時刻準備接收,初始是使用了while True來實現(xiàn)試試監(jiān)聽,后來發(fā)現(xiàn)這樣程序根本無法運行(無法進入界面),后來通過搜索,以線程的方式實現(xiàn)了互不干擾的實時監(jiān)聽。(python3里thread的庫名稱更改成了_thread)
編輯:黃飛
-
串口
+關(guān)注
關(guān)注
14文章
1554瀏覽量
76514 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84688 -
pyqt5
+關(guān)注
關(guān)注
0文章
25瀏覽量
3402 -
上位機
+關(guān)注
關(guān)注
1文章
3瀏覽量
2656
發(fā)布評論請先 登錄
相關(guān)推薦
評論