Qt 串口类QSerialPort 使用笔记

原创 2015年05月06日 20:37:04

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);
}



相关文章推荐

初次使用QT5串口类QSerialPort

因为工作需要,现在正在学习Qt的串口通信。Qt4的话需要使用第三方类,使用起来也非常简单,只需要把对应的文件添加到自己的项目中就可以了,我参考的是Qt论坛上的demo,刘大师和yafei的demo都非...
  • zbw1185
  • zbw1185
  • 2016年05月25日 11:24
  • 6884

Qt 串口类QSerialPort 学习笔记

一、串口类简介 当前的QtSerialPort模块中提供了两个C++类,分别是QSerialPort 和QSerialPortInfo。   QSerialPort 类提供了操作串口的各种接口。...

Qt之串口类QSerialPort使用笔记

本文转载自:http://blog.csdn.net/liyuanbhu/article/details/45540825 虽然现在大多数的家用PC机上已经不提供RS232接口了。但是由于RS23...

QSerialPort处理串口通信简单示例

串口通信需要添加Qt相关库: QT += serialport 大概是这样的。首先可以利用QSerialPortInfo读取设备相关信息,然后我们用容器把他们装起来,再利用QSerialPort与端...

QT串口编程的相关类(QSerialPortInfo)

QT Serial Port相关的类只有两个QSerialPortInfo(#include) 和QserialPort(#include) 先来介绍QSerialPortInfo 1:QSeri...

QT串口编程的相关类2(QSerialPort)

QT Serial Port相关的类只有两个QSerialPortInfo(#include) 和QserialPort(#include) 在http://blog.csdn.net/mcu_tia...

Qt4添加QSerialPort模块

Qt中添加了QSerialPort类,非常好用,可是由于各种原因,很多人还是要用Qt4,比如我,后来发现官方文档说QSerialPort支持Qt4,就研究了一下,比较笨,搞了好久才弄好。 第一步:下载...
  • yuyu414
  • yuyu414
  • 2015年01月04日 22:10
  • 5907

QT5串口编写简单的上位机

最近在学习嵌入式,上位机又是一个不可缺少的工具,于是就开始接触QT,学习编写上位机。 刚开始的时候什么都不懂,发现http://www.devbean.net/2012/08/qt-study-roa...

QSerialPort适应多线程应用的改进

为兼容类Unix系统,Qt库的设备接口使用了基于select的事件驱动,这使得设备对象必须存在于某一个线程中,而因为select事件无法直接从设备跨线程传输,双工设备的跨线程操作也无法直接实现。 对...

Qt 串口类QSerialPort 使用笔记

Qt 串口类QSerialPort 使用笔记   虽然现在大多数的家用PC机上已经不提供RS232接口了。但是由于RS232串口操作简单、通讯可靠,在工业领域中仍然有大量的应用。Qt以前的版本...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt 串口类QSerialPort 使用笔记
举报原因:
原因补充:

(最多只允许输入30个字)