Qt SerialPort 与 PyQt5 (一)

正文会先介绍 Qt 自带的串口模块,然后引出在 PyQt5
中运用这些模块的方法。
为演示类和函数的切切实实采用办法,我会在串口上连续一华 Arduino
Uno。当然也得下虚拟串口程序开展现身说法,但是于虚拟出来的串口总会差有音讯,所以我或者利用了外接
Arduino 的措施。
系统环境:Win10 64位
转载请注明出处:http://www.jianshu.com/u/5e6f798c903a

1.简介

Qt 串口模块提供的基本功能包括:串口配置、I/O 操作、获取与设置 RS-232
引脚的主宰信号等。该模块的 C++

包含
QSerialPort(用于提供访问串行端口的函数)和
QSerialPortInfo(提供本机现存串行端口的相干信息),官方又也提供了部分应用程序示例

本模块不支持以下项目:

  • 顶点功能,如 echo 和 CR/LF 控制等
  • 文本模式
  • 当针对串口进行读取或摹写副常,配置超时和推迟
  • 引脚信号变化通知

在 Qt 应用程序中动用串行端口时,请上加 #include < QSerialPort >
对 PyQt5 而言,则是:from PyQt5.QtSerialPort import QSerialPort

当 Qt 应用程序中查阅本机现存串口信息经常,请加加
#include < QSerialPortInfo >
对 PyQt5 而言,则是:from PyQt5.QtSerialPort import QSerialPortInfo

及模块连接时,请将 QT += serialport 添加到
qmake
.pro 文件中,PyQt5 中无接近操作。

2.QSerialPortInfo 类

法定文档
Header: #include <QSerialPortInfo>
qmake: QT += serialport
Since: Qt 5.1

该类用于供本机现有串口的相关消息。

QSerialPortInfo.png

静态公共成员:

  • QList<QSerialPortInfo> availablePorts()
  • QList<qint32>standardBaudRates()

2.1 创建 QSerialPortInfo 对象

  • QSerialPortInfo()
    布局一个空 QSerialPortInfo 对象。如果 QSerialPortInfo
    对象啊空,则代表不有所串口定义,若对该调整用
    isNull()
    函数,会返回 True
  • QSerialPortInfo(const QSerialPort &port)
    用指定的 QSerialPort 对象,构建相应的 QSerialPortInfo 对象。
  • QSerialPortInfo(const QString &name)
    基于加的差口名 &name,构造 QSerialPortInfo 对象。
    该构造器会在本机当前可用的串口中搜寻具有相应名称的串口,并为该端口构建
    QSerialPortInfo 实例。
  • QSerialPortInfo(const QSerialPortInfo &other)
    创办另一个 QSerialPortInfo 对象的副本。

每当 PyQt5 调用上述报告句便只是创造相应实例。

Tips:QSerialPortInfo
实例对象可用作
QSerialPort
类中 setPort() 方法的输入参数,以此创建
QSerialPort
的实例。

class QSerialPortInfo(): # skipped bases: <class 'sip.simplewrapper'>
    """
    QSerialPortInfo()
    QSerialPortInfo(QSerialPort)
    QSerialPortInfo(str)
    QSerialPortInfo(QSerialPortInfo)
    """

2.2 交换 QSerialPortInfo 对象

  • void
    QSerialPortInfo::swap(QSerialPortInfo
    &other)
    一旦有个别独分级针对不同之 QSerialPortInfo
    实例的变量名,对中间一个实例调用 swap()
    方法,并以另外一样用作参数,便可拿鲜单变量名所指向的实例对象开展换。此操作会非常迅速的履行,并且永远不会见砸。

演示代码:

from PyQt5.QtSerialPort import QSerialPortInfo

port_Arduino = QSerialPortInfo('COM4')
port_virtual = QSerialPortInfo('COM1')
print(port_Arduino.portName())
print(port_virtual.portName())

port_Arduino.swap(port_virtual)
print(port_Arduino.portName())
print(port_virtual.portName())

输出:

COM4
COM1
COM1
COM4

2.3 销毁 QSerialPortInfo 对象

  • ~QSerialPortInfo()
    销毁 QSerialPortInfo 对象。当目标为灭绝后,便无能为力再次引用该目标的价值。

PyQt5 中从来不这个函数,可应用 del 替代。

2.4 查询可用串口列表

  • QList<QSerialPortInfo> QSerialPortInfo::availablePorts()
    [static]

静态函数 availablePorts() 可生成是因为
QSerialPortInfo
对象成的列表。列表中的每个
QSerialPortInfo
对象还代表一个单身的串行端口,并且可通过这些
QSerialPortInfo
对象查询相应端口的称呼、系统职务、描述信息及制造商等消息。

示范代码:

# python 代码:
from PyQt5.QtSerialPort import QSerialPortInfo

port_list = QSerialPortInfo.availablePorts()
print(port_list[0].portName())
print(port_list[0].description())

输出:

COM4
Genuino Uno

2.5 查询串口信息

讲述信息

  • QString QSerialPortInfo::description() const
    一经在用于描述串口相关消息的字符串,则回该字符串。否则,返回空字符串。

演示代码:

# Python 代码:
from PyQt5.QtSerialPort import QSerialPortInfo

port_Arduino = QSerialPortInfo('COM3')
print(port_Arduino.description())

输出:

Genuino Uno

活识别码

  • quint16
    QSerialPortInfo::productIdentifier() const
    如若为询问的 QSerialPortInfo 串口实例存在 16-bit
    产品编码,则归该编码;否则,返回 0。

  • bool QSerialPortInfo::hasProductIdentifier() const

    假如叫询问的 QSerialPortInfo 串口实例存在中的 16-bit
    产品编码,便会回去 true ;否则,返回 false

以身作则代码:

# Python 代码:
port_Arduino = QSerialPortInfo('COM3')
print(port_Arduino.hasProductIdentifier())
print(port_Arduino.productIdentifier())

输出:

True
579

供商识别码

  • quint16
    QSerialPortInfo::vendorIdentifier() const
    要是给询问的 QSerialPortInfo 串口实例存在 16-bit
    的供商识别码,则赶回该编码;否则,返回 0。
  • bool QSerialPortInfo::hasVendorIdentifier() const
    万一为询问的 QSerialPortInfo 串口实例存在中的 16-bit
    供应商编码,则赶回 true ;否则,返回 false

示范代码:

# python 代码:
port_Arduino = QSerialPortInfo('COM4')
print(port_Arduino.hasVendorIdentifier())
print(port_Arduino.vendorIdentifier())

输出:

True
9025

制造商

  • QString
    QSerialPortInfo::manufacturer() const
    设叫询问的 QSerialPortInfo
    串口实例含有制造商字符串,则归该字符串;否则,返回一个空字符串。

以身作则代码:

# python 代码:
port_Arduino = QSerialPortInfo('COM4')
print(port_Arduino.manufacturer())

输出:

Arduino LLC (www.arduino.cc)

端口名称

  • QString
    QSerialPortInfo::portName() const
    回去给询问的 QSerialPortInfo 串口实例的称。

示范代码:

# python 代码:
port_Arduino = QSerialPortInfo('COM4')
print(port_Arduino.portName())

输出:

COM4

序列号

  • QString
    QSerialPortInfo::serialNumber() const
    若果让询问的 QSerialPortInfo
    串口实例存在序列号字符串,则归该字符串;否则,返回一个空字符串。
    在意:序列号可能会见包含字母,该函数在 Qt 5.3 被引入。

以身作则代码:

# python 代码:
port_Arduino = QSerialPortInfo('COM4')
print(port_Arduino.serialNumber())

输出:

55438303539351200210

网职务

  • QString
    QSerialPortInfo::systemLocation() const
    回给询问的 QSerialPortInfo 串口实例的网职务。

以身作则代码:

# python 代码:
port_Arduino = QSerialPortInfo('COM4')
print(port_Arduino.systemLocation())

输出:

\\.\COM4

2.6 测试串口状态

  • bool QSerialPortInfo::isBusy() const
    假定被询问的 QSerialPortInfo 串口实例忙,则回 true ;否则,返回
    false
  • bool QSerialPortInfo::isNull() const
    要是让询问的 QSerialPortInfo 串口实例持有串口定义,则归 false
    ;否则。返回 true
  • bool QSerialPortInfo::isValid() const
    比方吃询问的 QSerialPortInfo 串口实例存在于本机上,则赶回 true
    。否则回 false 。注意,该函数已经让抛!!!

演示代码:

# python 代码:
port_Arduino = QSerialPortInfo('COM4')
print(port_Arduino.isBusy())
print(port_Arduino.isNull())
print(port_Arduino.isValid(),end='\n\n')

port_null = QSerialPortInfo()
print(port_null.isBusy())
print(port_null.isNull())
print(port_null.isValid())

输出:

False
False
True

False
True
False

2.7 查询专业波特率列表

  • QSerialPortInfo::standardBaudRates() [static]
    回在手上系平台及可用之正经波特率列表。

示范代码:

from PyQt5.QtSerialPort import QSerialPortInfo

print(QSerialPortInfo.standardBaudRates())

输出:

[110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200, 128000, 256000]