Qt 串口类QSerialPort 使用笔记

Qt 串口类QSerialPort 使用笔记

虽然现在大多数的家用PC机上已经不提供RS232接口了。但是由于RS232串口操作简单、通讯可靠,在工业领域中仍然有大量的应用。Qt以前的版本中,没有提供官方的对RS232串口的支持,编写串口程序很不方便。现在好了,在 Qt5.1 中提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序。 本文就简单的讲讲QtSerialPort模块的使用。

当前的QtSerialPort模块中提供了两个C++类,分别是QSerialPort 和QSerialPortInfo。

QSerialPort 类提供了操作串口的各种接口。

QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息。

使用方法

先介绍 QSerialPortInfo 的使用。下面是一个简单的例子,用来列举出电脑上全部的串口设备。

首先,需要在pro文件中增加如下内容:

QT += serialport

Cpp 文件如下:

#include <QCoreApplication>
#include <QDebug>

#include <QSerialPort>
#include <QSerialPortInfo>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        qDebug() << "Name : " << info.portName();
        qDebug() << "Description : " << info.description();
        qDebug() << "Manufacturer: " << info.manufacturer();
        qDebug() << "Serial Number: " << info.serialNumber();
        qDebug() << "System Location: " << info.systemLocation();
    }
    return a.exec();
}

在我的电脑上显示的结果如下:

Name :  "COM1"
Description :  "通信端口"
Manufacturer:  "(标准端口类型)"
Serial Number:  ""
System Location:  "\\.\COM1"
Name :  "COM5"
Description :  "USB Serial Port"
Manufacturer:  "FTDI"
Serial Number:  "A400G3UXA"
System Location:  "\\.\COM5"

通常,我们需要指定程序使用某一个确定的串口,这时不能只使用串口名称,因为USB串口每次插在不同的USB口上时获得的串口名称都可能有变化。这时可以利用串口的序列号,这个号码一般来说是唯一的,比如下面的代码,首先遍历所有的串口,找到我们需要的串口后就返回。

#include <QCoreApplication>
#include <QDebug>
#include <QSerialPort>
#include <QSerialPortInfo>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSerialPortInfo com_info;
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        if( info.serialNumber() == "A400G3UXA" )
        {
            com_info = info;
            break;
        }
    }
    qDebug() << "Name : " << com_info.portName();
    qDebug() << "Description : " << com_info.description();
    qDebug() << "serialNumber: " << com_info.serialNumber();
    return a.exec();
}

QSerialPort 负责具体的串口操作。选定串口后,要先打开串口,才能设置波特率等参数。这些参数都设置好了就可以使用了。最基本的操作无非是read() 和 write()。需要注意的是这两个操作都是非阻塞的。

另外有一个重要的signal 也需要用到,那就是 void QIODevice::readyRead()

每次串口收到数据后都会发出这个signal。我们的程序中需要定义一个slot,并将其与这个signal 相连接。这样,每次新数据到来后,我们就可以在slot中读取数据了。这时一定要将串口缓冲区中的数据全部读出来,可以利用readAll() 来实现。

下面的代码片段给出了设置串口的例子。

    m_reader.setPort(info);
    if(m_reader.open(QIODevice::ReadWrite))
    {
        qDebug() << "m_reader.open(QIODevice::ReadWrite)";
        m_reader.setBaudRate(QSerialPort::Baud9600);
        m_reader.setParity(QSerialPort::NoParity);
        m_reader.setDataBits(QSerialPort::Data8);
        m_reader.setStopBits(QSerialPort::OneStop);
        m_reader.setFlowControl(QSerialPort::NoFlowControl);

        m_reader.clearError();
        m_reader.clear();
        connect(&m_reader, SIGNAL(readyRead()), this, SLOT(readyReadSlot()));
}

void Dialog::readyReadSlot()
{
    qDebug() << "x";
    QByteArray arr = m_reader.readAll();
    do_something(arr);
}

时间: 2024-08-07 13:20:39

Qt 串口类QSerialPort 使用笔记的相关文章

Qt 串口通信

在Qt5之前,串口通信基本依赖于第三方库,下面是我曾接触过的串口通信类库: 名称 语言 平台   QextSerialPort QT C++ Win/Linux http://sourceforge.net/projects/qextserialport/files/ QSerialPort QT C++ QT5已经集成 libserial C++ Linux http://files.cnblogs.com/kyyblabla/libserial-0.5.2.gz.7z 以上串口通信类库通信过

QT开发(五十)——QT串口编程基础

QT开发(五十)--QT串口编程基础 一.QtSerialPort简介 1.串口通信基础 目前使用最广泛的串口为DB9接口,适用于较近距离的通信.一般小于10米.DB9接口有9个针脚. 串口通信的主要参数如下: A.波特率:衡量通信速度的参数,表示每秒钟传送的bit的个数.例如9600波特表示每秒钟发送9600个bit. B.数据位:衡量通信中实际数据位的参数,当计算机发送一个信息包,实际包含的有效数据位个数. C.停止位:用于表示单个包的最后一位.典型的值为1和2位. D.奇偶校验位:串口通信

串口类QextSerialPort

QextSerialPort类是基于Qt程序串口类,在win和linux都适用,win下可以使用EventDriven,linux好像不行. 整个类的层次关系. 我下载的是qextserialport-1.2win-alpha这个版本,不过编译时有点问题,Posix下的open函数setTimeout(Settings.Timeout_Sec, Settings.Timeout_Millisec); 第一个参数应该去掉,现在Setting结构体里没有这个参数. 整个类可以编译成动态库. 如果当前

Qt串口实现921600波特率的方法

环境配置: 主机:XP QT:5.4.0 写在这里的重点并不是告诉人如何在Qt的串口编程中实现921600的Bps. 1.在Qt中使用串口,我们需要一个第三方的串口类:qextserialport.在其qextserialbase.h文件中,提供了如下常用的波特率: enum BaudRateType { BAUD50, //POSIX ONLY BAUD75, //POSIX ONLY BAUD110, BAUD134, //POSIX ONLY BAUD150, //POSIX ONLY B

qt串口

qt串口通信:#ifdef _TTY_POSIX#include "posix_qextserialport.h"#define QextBaseType Posix_QextSerialPort #else#include "win_qextserialport.h"#define "QextBaseTypeport.h"#define QextBaseType Win_QexSerialPort#endif QextSerialBase类中

QT开发(二十七)——QT常用类(一)

QT开发(二十七)--QT常用类(一) 一.QString 1.QString简介 QString提供了Unicode编码的字符串,使用隐式共享技术来节省内存和不必要的数据拷贝,不必考虑跨平台的兼容性. QString类成员函数中除了 ascii().latin1().utf8().local8Bit()函数,其他所有的函数都是可重入的. 2.QString成员函数 QString::QString ( const QChar * unicode, int size ) QString::QSt

一个由印度人编写的VC串口类

软件介绍 一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些基础知识,如怎么用VC打开串口,如何对串口进行配置,读串口.写串口等. 这个类有点特别,它没有使用事件驱动原理,它是以查询方式工作的. 简介: 对没有接触过串口通信的VC程序员来说显得非常困难,很久以前我在 codeguru.com 上搜索过串口通信相关信息得到了非常大的帮助,从那时起能编写一个简单易用的VC 串口类是我的梦想. 经过七个月在串口通信编程方面实践经验后,我编写了一个基于API

C++ 类包含关系Demo 笔记

is-a关系  类包含关系 构造函数 复制构造函数 重载赋值操作符 析构函数 动态内存空间分配和释放 new delete操作 static 数据成员 友元函数 重载输入>>和输出<<操作符 #include<iostream> #include <windows.h> using namespace std; class person { private: char *name; int age; public: person() { //class me

一个印度人写的VC串口类CSerialCom(有串口基础介绍)

一个由印度人编写的VC串口类(也是一种VC串口控件),他还配合这个类写了VC 串口通信方面的一些基础知识,如怎么用VC打开串口,如何对串口进行配置,读串口.写串口等. 这个类有点特别,它没有使用事件驱动原理,它是以查询方式工作的. 简介: 对没有接触过串口通信的VC程序员来说显得非常困难,很久以前我在 codeguru.com 上搜索过串口通信相关信息得到了非常大的帮助,从那时起能编写一个简单易用的VC 串口类是我的梦想. 经过七个月在串口通信编程方面实践经验后,我编写了一个基于API实现的简单