在这篇博客中,我们将介绍如何使用 QtSerialPort
库来进行串口通信。你将学习如何设置串口、发送和接收数据。无论你是初学者还是有经验的开发者,这里都会有实用的示例和技巧,帮助你快速掌握串口编程。
我的第一篇博客,具体的我也不会表达,大家可以看注释
一些我这次用到的功能函数,具体的可以问ai查阅,功能函数很多,这里不一一介绍,需要用到的时候可以去选择调用
#创建串口函数
self.serial = QSerialPort()
#绑定串口信号到槽
self.serial.readyRead.connect(self.receive_data)
#串口接受到值的大小
serial.bytesAvailable()
#从串口读取所有数据数据转换为字节流将字节流解码为 UTF-8 编码的字符串
data = self.serial.readAll().data().decode('utf-8')
#将字符串转换成字节流发送
self.serial.writeData(data_to_send.encode())
#设置串口号
self.serial.setPortName(port_name)
#设置串口波特率w
self.serial.setBaudRate(baud_rate)
#打开串口,判断串口是否打开成功,成功返回1,否则返回0
self.serial.open(QSerialPort.ReadWrite)
#读取端口号和信息
ports = QSerialPortInfo.availablePorts()
#获取串口的端口号
port.portName()
#获取串口的信息
port.description()
#这两个是串口的信号,可以自己绑定到槽
readyRead:当有数据可读时发射。
errorOccurred:当发生错误时发射。
下面就给到我们的代码和演示,你们没有ui文件不能直接用,把我ui部分删了就行了,我后面应该会发百度网盘链接。
import sys
from PyQt5.QtSerialPort import QSerialPortInfo, QSerialPort
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QPushButton, QTextEdit
from PyQt5 import uic
#摄像头界面的
class MyWindow1(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.ui = uic.loadUi("sxt.ui")
def login(self):
pass
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setGeometry(0, 0, 200, 400) #设置界面大小位置
#这一段不用看,我跳转界面的功能
self.ui = uic.loadUi("1.ui") #导入1.ui文件
self.login_btn = self.ui.pushButton_9 #引出1.ui文件里面的按键1
self.login_btn.clicked.connect(self.login) #绑定按键的信号到槽login
self.usart_init() #调用我的新函数
def usart_init(self):
self.serial = QSerialPort() #创建串口函数
self.text_edit = QTextEdit(self) #创建一个文本框,我用来放接收串口的数据的
self.text_edit.setGeometry(0, 80, 200, 300) #设置大小位置,做个应该不用我介绍了后面
self.port_combo_box = QComboBox(self) #创建下拉列表,我用来存放串口号的
self.port_combo_box.setGeometry(0, 0, 150, 20)
self.ports = QSerialPortInfo.availablePorts() #做个函数是获取系统中返回的所有串口,是一个列表,你们可以打印自己看
#循环取出上面列表里面的端口号和端口信息,我这里直接存放在列表里面了
self.port_combo_box.addItems([x.portName()+' '+x.description() for x in self.ports])
self.port_combo_box1 = QComboBox(self) #创建列表存放波特率
self.port_combo_box1.setGeometry(0, 30, 150, 20)
self.port_combo_box1.addItems(['9600','115200']) #添加元素到列表里面
self.boot = QPushButton("打开串口",self) #创建按键,我用来打开串口和关闭串口的
self.boot.setGeometry(0, 60, 150, 20)
self.boot.clicked.connect(self.bot_irq) #绑定按键信号与槽
self.serial.readyRead.connect(self.receive_data) #绑定串口接受到的信号和槽
#串口接受数据的槽
def receive_data(self):
data = self.serial.readAll().data().decode('utf-8') #将接收到的数据转成编码类型在转换成utf-8
self.text_edit.append(data) #将串口信息追加到文本框下
self.ui.label.setText(data) #这里模拟一个数据,单片机发的数据给到我们的显示文本上面
def bot_irq(self):
com = self.port_combo_box.currentText()[:5] #现在选择的端口号内容文本前5位给到com,因为设置串口端口号只能是端口号,我们上面存放的是端口号加信息
Baud = int(self.port_combo_box1.currentText()) #和什么一行一样,但是设置波特率传参是个int类型,所以我们要转换一下
print(com,Baud) #这里可以打印一下看看对不对
self.serial.setPortName(com) #设置串口端口号
self.serial.setBaudRate(Baud) #设置串口波特率
#这里主要实现按键按键变换文本,不多介绍
if self.sender().text()=="打开串口":
if self.serial.open(QSerialPort.ReadWrite): #这里是打开串口,返回1为打开成功,0失败,可以不进行判断,我这里主要是为了自己知道
self.boot.setText("关闭串口")
print("串口打开成功")
self.text_edit.append("串口打开成功")
else:
print("串口打开失败")
self.text_edit.append("串口打开失败")
else:
self.serial.close() #关闭串口函数
self.boot.setText("打开串口")
print("串口已关闭")
self.text_edit.append("串口已关闭")
def login(self):
self.w1 = MyWindow1()
self.w1.ui.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWindow()
# 展示窗口
w.ui.show()
w.show()
app.exec()
到这里我们就可以进行串口接受了,将下位机发来的数据自己拿去调用了,我这里进行模拟。
可以先用串口模拟软件关联俩串口
这里是我的代码运行的一个效果
打开串口1,这里提示我们打开成功 和端口号
这里用上串口调试助手发个数据试试,也是顺利接受到没有问题
下面我发送了个数据,在我之前代码里面写的有模拟,也可以看到我们的数据发生了变换
这里我没有写发送的,学到这里的同学应该就已经会的差不多了吧,绑定按键到信号与槽,然后发送文本就可以了,很简单的函数在第一段代码里面都有,嘻嘻