PyQt5 串口通信和下位机

在这篇博客中,我们将介绍如何使用 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,这里提示我们打开成功 和端口号

这里用上串口调试助手发个数据试试,也是顺利接受到没有问题

下面我发送了个数据,在我之前代码里面写的有模拟,也可以看到我们的数据发生了变换

这里我没有写发送的,学到这里的同学应该就已经会的差不多了吧,绑定按键到信号与槽,然后发送文本就可以了,很简单的函数在第一段代码里面都有,嘻嘻

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值