Qt SerialPort 与 PyQt 5 (一)

本文会先介绍 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 调用上述语句便可创建相应实例。

TipsQSerialPortInfo 实例对象可用作 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]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342