找回密码
 立即注册
Qt开源社区 门户 查看内容

QT软件开发-第十四章 基于QT5串口设备开发 14.1~14.3

2019-5-7 14:44| 发布者: admin| 查看: 2783| 评论: 0

摘要: 点击上方蓝字关注我们14.1 QT下串口编程介绍14.1.1 串口协议介绍串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (SeriaInterface) 是指数据一位一位 ...


点击上方蓝字关注我们




14.1 QT下串口编程介绍

14.1.1 串口协议介绍


串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (SeriaInterface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

串行接口 (SeriaInterface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。

RS-232 也称标准串口,最常用的一种串行通讯接口。

串口由于其简单和可靠,目前在像嵌入式系统,机器人等工业中依旧用得很多。

QtSerialPort模块是Qt5库的附加部分,为硬件和虚拟的串口提供了统一的接口。注意:该模块也增加了对Qt4的支持。使用QtSerialPort模块,开发者可以大大缩短开发串口相关的应用程序的周期。使用QtSerialPort模块最初是来源于第三方库QSerialDevice(2.0分支),现在QtSerialPort已经移到了https://codereview.qt-project.org/代码库上,后面的QT5版本都自带了QtSerialPort相关库。

14.1.2 功能介绍


目前,该QT5模块API只包括两个类:QSerialPort 和QSerialPortInfo

SerialPort是该模块的基础类,提供了一系列基础的方法和属性来访问串口资源。

SerialPortInfo是一个帮助类。它提供了系统上可用的串口的信息。

在QT工程中使用串口相关的类需要在pro文件中添加以下代码:

QT+= serialport

工程中包含相应的头文件

#include <QtSerialPort/QSerialPort>

#include <QtSerialPort/QSerialPortInfo>


14.2 QSerialPortInfo帮助信息类介绍


  • 详细说明:

QSerialPortInfo提供了有关现有串行端口的信息。

使用静态函数availablePorts()生成QSerialPortInfo对象列表。 列表中的每个QSerialPortInfo对象表示一个串行端口,可以查询端口名称,系统位置,说明和制造商。 QSerialPortInfo类也可以用作QSerialPort类的setPort()方法的输入参数。  其他的另请参阅QSerialPort。

14.2.1 构造函数与析构函数


QSerialPortInfo()

QSerialPortInfo(const QSerialPort & port)

QSerialPortInfo(const QString & name)

QSerialPortInfo(const QSerialPortInfo & other)

~QSerialPortInfo()


14.2.2 判断串口com口的状态


booQSerialPortInfo::isBusy() const

如果当前串口COM口忙就返回真,否则返回假!

14.2.3 返回当前串口的名称


QString QSerialPortInfo::portName() const

如果串口可用就返回串口的名称,否则返回空字符串!

14.2.4 返回当前串口的供应商16位编号


quint16 QSerialPortInfo::vendorIdentifier() const

如果当前串口可用,就返回16位供应商编号,否则返回空!

14.2.5. 互换串口的信息


    void QSerialPortInfo::swap(QSerialPortInfo & other)

将另一个串口信息,整体赋值给当前串口!

14.2.6 返回当前串口的产品序列号


    quint16 QSerialPortInfo::productIdentifier() const

返回串口的16位产品编号,如果可用,否则返回0。

14.2.7 返回当前串口的产品序列号-字符串方式


  QString QSerialPortInfo::serialNumber() const

如果串口可用,返回串口序列号的字符串,否则返回空字符串。

14.2.8 判断当前串口是否支持


 booQSerialPortInfo::isNull() const

支持返回假,否则返回真!

14.2.9 获取串口支持的波特率


QList<qint32> QSerialPortInfo::standardBaudRates()

示例:

   /*保存了串口信息*/

    my_UsartInfo = new QSerialPortInfo(arg1);

    /*构造一个列表类*/

    QList<qint32> my_list;

    /*获取串口支持的波特率*/

    my_list=my_UsartInfo->standardBaudRates();

    /*打印出支持的波特率*/

    for(int i=0;i<my_list.count();i++)

    {

        //取出列表中指定的值

        qDebug()<<my_list.at(i);

    }


14.2.10 获取当前系统支持的串口端口


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

示例:

  /*构造一个列表*/

    QList<QSerialPortInfo> usart_device_list;

    /*获取系统支持的串口端口*/

    usart_device_list=my_UsartInfo->availablePorts();

    /*判断列表是否为空*/

    if(usart_device_list.isEmpty())

    {

        qDebug()<<"列表为空!";

        return;

    }

    /*打印出支持的串口名称*/

    for(int i=0;i<usart_device_list.count();i++)

    {

        qDebug()<<"串口名称:"<<usart_device_list.at(i).portName();

    }


14.3 QSerialPort串口类介绍

14.3.1 QSerialPort功能使用介绍


QSerialPort提供访问串行端口的功能。

你可以使用QSerialPortInfo帮助程序类获取有关可用串行端口的信息,该类允许枚举系统中的所有串行端口。这对于获取要使用的串行端口的正确名称很有用。可以将QSerialPortInfo帮助类的对象作为参数传递给setPort()或setPortName()方法以分配所需的串行设备。

设置端口后,可以使用open()方法以只读(r / o),只写(w / o)或读写(r / w)模式打开它。

注意:串行端口始终以独占访问方式打开(也就是说,其他进程或线程无法访问已打开的串行端口)。

成功打开后,QSerialPort尝试确定端口的当前配置并自行初始化。可以使用setBaudRate(),setDataBits(),setParity(),setStopBits()和setFlowControl()方法将端口重新配置为所需的设置。

有几个属性可用于引脚分配信号,即:QSerialPort :: dataTerminalReady,QSerialPort :: requestToSend。也可以使用pinoutSignals()方法查询当前引脚排列信号集。

一旦知道端口已准备好读取或写入,可以使用read()或write()方法。另外也可以调用readLine()和readAll()方便方法。如果不是所有的数据都被一次读取,其余的数据将与随后新传入数据一同被附加到QSerialPort的内部缓冲区。你可以使用setReadBufferSize()来限制读取缓冲区的大小。

串口使用完毕使用close()方法关闭端口并取消I / O操作。

看下面的例子:

int numRead = 0, numReadTota= 0;

  char buffer[50];

  for (;;) {

      numRead  = serial.read(buffer, 50);

      // Do whatever with the array

      numReadTota+= numRead;

      if (numRead == 0 && !serial.waitForReadyRead())

          break;

  }

如果waitForReadyRead()返回false,则表示连接已关闭或发生错误。

使用阻塞串行端口编程与使用非阻塞串行端口编程截然不同。 阻塞串行端口不需要事件循环,并且通常会导致代码更简单。 但是,在GUI应用程序中,阻塞串行端口只能用于非GUI线程,以避免卡住用户界面。

有关这些方法的更多详细信息,请参阅示例应用程序。

QSerialPort类也可以与QTextStream和QDataStream的流操作符(运算符<<()和operator >>())一起使用。 但是,需要注意的一个问题是:在尝试使用操作符>>()重载操作符进行读取之前,确保有足够的数据可用。

14.3.2 清除缓冲区


根据给定方向的方向,丢弃输出或输入缓冲区的所有字符。这包括清除内部类缓冲和UART缓冲区。也终止等待读或写操作。如果成功,返回true,否则返回false。

booQSerialPort::clear(Directions directions = AllDirections)


14.3.3 关闭串口


void QSerialPort::close()

注意:串行端口被打开之前试图关闭它;会产生NotOpenError错误代码。

14.3.4 打开串口


booQSerialPort::open(OpenMode mode)

从QIODevice::open()重新实现。

打开串口使用OpenMode模式,然后返回true,如果成功返回真; 否则返回false。

警告:QIODevice模式是:只读的,QIODevice:WriteOnly,或QIODevice::读写。其他的模式是不支持的。

14.3.5 返回等待读的字节数


qint64 QSerialPort::bytesAvailable() const


14.3.6 判断数据是否读完


booQSerialPort::atEnd() const

示例:

// This slot is connected to QSerialPort::readyRead()

    void QSerialPortClass::readyReadSlot()

    {

        while (!port.atEnd()) {

            QByteArray data = port.read(100);

            ....

        }

    }


14.3.7 设置串口缓冲区的大小


void QSerialPort::setReadBufferSize(qint64 size)

默认的缓冲区是无限的!

14.3.8 返回缓冲区的大小


qint64 QSerialPort::readBufferSize() const

如果返回0,就表示缓冲区的大小是无限的!

14.3.9 读出所有的数据


QByteArray QIODevice::readAll()

使用示例:

    QByteArray rx_data;

    /*读取串口缓冲区所有的数据*/

    rx_data=my_serialport->readAll();


14.3.10 设置波特率


qint32baudRate(Directions directions = AllDirections) const

boolsetBaudRate(qint32 baudRate, Directions directions = AllDirections


14.3.11 设置奇偶校验位


Parityparity() const

boolsetParity(Parity parity)


14.3.12 设置停止位


StopBitsstopBits() const

boolsetStopBits(StopBits stopBits)


14.3.13 设置数据位


DataBitsdataBits() const

boolsetDataBits(DataBits dataBits)


14.3.14 设置流控开关


FlowControlflowControl() const

boolsetFlowControl(FlowControflowControl)


14.3.15 串口配置示例


   /*配置串口的信息*/

        my_serialport->setPortName(Uart_name);          //COM的名称

        if(!(my_serialport->open(QIODevice::ReadWrite)))      //打开的属性权限

        {

            QMessageBox::warning(this, tr("-----串口错误信息-----"),

                                           tr("串口打开失败!\n重新选择COM口"),

                                           QMessageBox::Ok);

                return;

        }

        my_serialport->setBaudRate(Uart_Baud);          //默认波特率

        my_serialport->setDataBits(QSerialPort::Data8); //数据位

        my_serialport->setParity(QSerialPort::NoParity);//奇偶校验

        my_serialport->setStopBits(QSerialPort::OneStop);//停止位

        my_serialport->setFlowControl(QSerialPort::NoFlowControl); //流控开关


14.3.16 读写相关信号


Header:

#include <QSerialPort>

qmake:

QT += serialport

Since:

Qt 5.1

Inherits:

QIODevice

继承与QIODevice类,可以使用QIODevice类的信号。

(1) 读数据信号


[signal] void QIODevice::readyRead()

有数据可读时发出该信号。可以用来检测串口是否有数据可读。

(2) 关闭设备信号


[signal] void QIODevice::aboutToClose()

设备将要关闭时发出该信号。可以做一些关闭处理,比如将缓冲区的数据发完。

(3) 设备关闭信号


void QIODevice::aboutToClose()

该信号在设备即将关闭时发出。 如果您在设备关闭前需要执行某些操作(例如,如果数据存储在需要写入设备的单独缓冲区中),请连接此信号。

(4) 成功写入串口设备的字节数


void QIODevice::bytesWritten(qint64 bytes)

每当数据的有效载荷写入设备的当前写入通道时,就会发出此信号。 bytes参数设置为写入此有效内容中的字节数。  可以依靠此信号来判断当前的串口数据是否发送成功。


技术合作与咨询

QQ:1126626497
关注我长按二维码可识别微信号:xl1126626497



----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:DS小龙哥 嵌入式技术资讯,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

1人点赞握手

雷人

路过

鸡蛋

刚表态过的朋友 (1 人)


公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了