日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python 利用PyQt5写一个简易的串口助手

發(fā)布時(shí)間:2024/1/8 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 利用PyQt5写一个简易的串口助手 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ?學(xué)習(xí)單片機(jī),STM32好長(zhǎng)時(shí)間了,也做了一些項(xiàng)目,一直想利用上位機(jī)實(shí)現(xiàn)電腦與單片機(jī)之間的傳輸數(shù)據(jù),利用串口助手是最直接的通信方式,但串口助手不適合做上位機(jī),如果會(huì)寫串口助手的軟件,基本能寫自己寫一個(gè)上位機(jī),歷時(shí)一個(gè)月,終于寫出一個(gè)簡(jiǎn)易的串口助手,筆者自己寫的軟件,有些Bug,分享出來(lái),僅供參考,歡迎大家一起學(xué)習(xí)與討論。

? ? ? ?目標(biāo):利用Python語(yǔ)言寫一個(gè)簡(jiǎn)易的串口助手

? ? ? ?環(huán)境:Win10,? python語(yǔ)言, PyQt5, Pycharm

? ? ? ?思路:先做出主體,慢慢優(yōu)化與添加其他的功能,在串口助手設(shè)計(jì)中主體是獲取串口ID號(hào),設(shè)置波特率,發(fā)送數(shù)據(jù),接收數(shù)據(jù),添加界面布局,信號(hào)觸發(fā)等操作。

? ? ? ?一、設(shè)置串口ID號(hào)

? ? ? ? 建議制作第一版串口助手,可以先選定固定串口和波特率進(jìn)行設(shè)計(jì),在筆者設(shè)計(jì)時(shí),固定一個(gè)串口為COM4,波特率為9600設(shè)計(jì),設(shè)置參考代碼如下:

self.t = serial.Serial('com4', 9600)port = self.t.portstrprint(port)

這樣就簡(jiǎn)單將串口設(shè)置為打開串口時(shí)為COM4,波特率為9600,COM4是筆者所用的電腦端口。后續(xù)將端口和波特率變?yōu)榭蛇x擇

? ? ? ? 二、發(fā)送數(shù)據(jù)和接收數(shù)據(jù)

? ? ? ?發(fā)送數(shù)據(jù)類型簡(jiǎn)單可分為字符串發(fā)送和十六進(jìn)制發(fā)送,發(fā)送數(shù)據(jù)方式是輸入發(fā)送,在本文中先實(shí)現(xiàn)字符串發(fā)送,后續(xù)再實(shí)現(xiàn)十六進(jìn)制發(fā)送。同理,接收數(shù)據(jù)也可先實(shí)現(xiàn)字符串接收,后續(xù)再實(shí)現(xiàn)十六進(jìn)制發(fā)送。參考代碼如下:

import serial import time import threading class SerialPort:message = ''def __init__(self, port, buand):super(SerialPort, self).__init__()self.port = serial.Serial(port, buand)self.port.close()if not self.port.isOpen():self.port.open()def port_open(self):if not self.port.isOpen():self.port.open() #打開串口def port_close(self):self.port.close()def send_data(self):data = input("請(qǐng)輸入要發(fā)送的數(shù)據(jù)(非中文)并同時(shí)接收數(shù)據(jù): ")n = self.port.write(data.encode()) #發(fā)送數(shù)據(jù)print(n)def read_data(self): #接收數(shù)據(jù)while True: self.message = self.port.readline() #接收數(shù)據(jù)print(self.message)serialPort = "COM4" # 串口 baudRate = 9600 # 波特率if __name__ == '__main__':mSerial = SerialPort(serialPort, baudRate)t1 = threading.Thread(target=mSerial.read_data)t1.start()while True:time.sleep(1)mSerial.send_data()

?三、加入界面布局

? ? ? ?利用PyQt5庫(kù)搭建界面,在界面布局中使用網(wǎng)格布局管理QGridLayout,代碼如下:

def initUI(self):grid = QGridLayout()self.portname = QLabel("端口號(hào)") #添加控件self.datanumber = QLabel("發(fā)送數(shù)據(jù)位數(shù):")self.datasender = QLabel("發(fā)送數(shù)據(jù):")self.datareview = QLabel("接收數(shù)據(jù):")self.button = QPushButton("發(fā)送")self.open_button = QPushButton("打開")self.portnameEdit = QLineEdit()self.datanumberEdit = QLineEdit()self.datasenderEdit = QLineEdit()self.datareviewEdit = QLineEdit()grid.addWidget(self.portname, 1, 0) #添加控件的位置grid.addWidget(self.portnameEdit, 1, 1)grid.addWidget(self.datanumber, 2, 0)grid.addWidget(self.datanumberEdit, 2, 1)grid.addWidget(self.datasender, 3, 0,)grid.addWidget(self.datasenderEdit, 3, 1, 1, 6)grid.addWidget(self.datareview, 4, 0)grid.addWidget(self.datareviewEdit, 4, 1, 1, 6)grid.addWidget(self.button, 5, 3)grid.addWidget(self.open_button, 5, 1)self.setLayout(grid) #布局self.button.clicked.connect(self.Cosender) #關(guān)聯(lián)"發(fā)送"按鈕與信號(hào)槽self.open_button.clicked.connect(self.Check_serial) #關(guān)聯(lián)“打開”按鈕與信號(hào)槽self.setGeometry(300,300,200,200) #設(shè)置窗體大小self.setWindowTitle("串口助手")

四、加入觸發(fā)信號(hào)

? ? ? ?在上面的布局管理中,加入了“打開”和“發(fā)送”兩個(gè)按鈕。需要給兩個(gè)按鈕加入信號(hào)槽。編寫好信號(hào)槽代碼后再關(guān)聯(lián)按鈕與信號(hào)槽。信號(hào)槽代碼如下:

def messageUI(self):'''提示串口打開狀況信息'''QMessageBox.critical(self, "錯(cuò)誤", "串口打開失敗,請(qǐng)選擇正確的串口") #彈出提示信息def Check_serial(self):'''檢測(cè)串口是否被打開'''try:self.t = serial.Serial('com4', 9600) #打開串口COM4port = self.t.portstr #返回但端口號(hào)self.portnameEdit.setText(port) #顯示在界面上self.flag_open=1except serial.serialutil.SerialException: #打開失敗,輸出提示信息self.messageUI() #提示信息def Cosender(self):'''“發(fā)送”按鈕,信號(hào)槽'''if self.flag_open==1: #串口被打開self.str_input = self.datasenderEdit.text() #返回上面的發(fā)送文字n = self.t.write((self.str_input+'\n').encode())self.datanumberEdit.setText(str(n-1)) #寫入數(shù)據(jù)位數(shù)框self.datasenderEdit.setText(str(self.str_input)) #寫入發(fā)送框time.sleep(1) # sleep() 與 inWaiting() 最好配對(duì)使用num = self.t.inWaiting() #獲取接收到的數(shù)據(jù)長(zhǎng)度if num:self.receivemessage = self.t.read(num) #讀取接收數(shù)據(jù)print(self.receivemessage)self.datareviewEdit.setText(str(self.receivemessage)[2:-1]) #寫入接收框else: #串口打開失敗self.messageUI()

? ? ?關(guān)聯(lián)按鈕與信號(hào)槽的代碼如下:

self.button.clicked.connect(self.Cosender) #關(guān)聯(lián)"發(fā)送"按鈕與信號(hào)槽self.open_button.clicked.connect(self.Check_serial) #關(guān)聯(lián)“打開”按鈕與信號(hào)槽

? ?這樣制作一個(gè)基本的簡(jiǎn)易串口助手完成。如有不足之處請(qǐng)多多指教。效果如圖1所示。后面在開發(fā)加入了串口,波特率可供選擇性,發(fā)送和接收數(shù)據(jù)有字符串和十六進(jìn)制等設(shè)計(jì),效果如圖2所示,有興趣的讀者可以自行下載源代。源代碼鏈接:

https://download.csdn.net/download/scx2006114/11579725

? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2? ? ? ? ? ? ????

參考資料鏈接:

? ?1.發(fā)送和接收數(shù)據(jù):https://blog.csdn.net/xiaoeleis/article/details/81484872

? ?2.頁(yè)面布局:https://blog.csdn.net/zhulove86/article/details/52563298

完整代碼如下:

import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, \QGridLayout, QLabel, QMessageBox, QComboBox, \QCheckBox import serial import time import serial.tools.list_portsclass CO2UI(QWidget):def __init__(self):super(CO2UI, self).__init__()self.initUI()global flag_open #標(biāo)志位,判斷串口是否打開self.flag_open = 0def initUI(self):grid = QGridLayout()self.portname = QLabel("端口號(hào)")self.datanumber = QLabel("發(fā)送數(shù)據(jù)位數(shù):")self.datasender = QLabel("發(fā)送數(shù)據(jù):")self.datareview = QLabel("接收數(shù)據(jù):")self.button = QPushButton("發(fā)送")self.open_button = QPushButton("打開")self.portnameEdit = QLineEdit()self.datanumberEdit = QLineEdit()self.datasenderEdit = QLineEdit()self.datareviewEdit = QLineEdit()grid.addWidget(self.portname, 1, 0)grid.addWidget(self.portnameEdit, 1, 1)grid.addWidget(self.datanumber, 2, 0)grid.addWidget(self.datanumberEdit, 2, 1)grid.addWidget(self.datasender, 3, 0,)grid.addWidget(self.datasenderEdit, 3, 1, 1, 6)grid.addWidget(self.datareview, 4, 0)grid.addWidget(self.datareviewEdit, 4, 1, 1, 6)grid.addWidget(self.button, 5, 3)grid.addWidget(self.open_button, 5, 1)self.setLayout(grid)self.button.clicked.connect(self.Cosender)self.open_button.clicked.connect(self.Check_serial)self.setGeometry(300,300,200,200)self.setWindowTitle("C02上位機(jī)")def messageUI(self):'''提示信息'''QMessageBox.critical(self, " ", "串口打開失敗,請(qǐng)選擇正確的串口")def Check_serial(self):'''檢測(cè)串口是否被打開'''try:self.t = serial.Serial('com4', 9600) #打開串口COM4port = self.t.portstr #返回但端口號(hào)self.portnameEdit.setText(port) #顯示在界面上self.flag_open=1except serial.serialutil.SerialException: #打開失敗,輸出提示信息self.messageUI() #提示信息def Cosender(self):if self.flag_open==1:if self.flag_open == 1: # 串口被打開self.str_input = self.datasenderEdit.text() # 返回上面的發(fā)送文字n = self.t.write((self.str_input + '\n').encode())self.datanumberEdit.setText(str(n - 1)) # 寫入數(shù)據(jù)位數(shù)框self.datasenderEdit.setText(str(self.str_input)) # 寫入發(fā)送框time.sleep(1) # sleep() 與 inWaiting() 最好配對(duì)使用num = self.t.inWaiting() # 獲取接收到的數(shù)據(jù)長(zhǎng)度if num:self.receivemessage = self.t.read(num) # 讀取接收數(shù)據(jù)print(self.receivemessage)self.datareviewEdit.setText(str(self.receivemessage)[2:-3]) # 寫入接收框else:self.messageUI()if __name__ == "__main__":app = QApplication(sys.argv)test = CO2UI()test.show()sys.exit(app.exec_())

?

總結(jié)

以上是生活随笔為你收集整理的Python 利用PyQt5写一个简易的串口助手的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。