QT 串口基本通信 笔记

QT 串口基本通信笔记

Qt 中串口通讯提供了 一个QtSerialPort模块,其中提供了 两个c++类,分别是QSerialPortQSerialPortInfo

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

要在应用程序中使用这些类,请使用以下include语句:

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

QT 项目想要使用 ***QtSerialPort***模块必须在.pro 文件中加入以下代码:

QT += serialport

所需 函数

1. 获取串口列表 QSerialPortInfo::availablePorts

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

QSerialPortInfo 提供的静态函数,
返回系统上可用的串口列表

主要作用是用来遍历 系统上可以使用的所有串口信息,以供 QSerialPort 链接使用。
具体用请看 实例 一

2. 设置 需要打开的串口名称 setPortName ,(这个一般由 QSerialPortInfo::availablePorts 提供)

void setPortName(const QString &name);

QSerialPort 提供的设置串行端口的名称。如果需要,可以将串行端口的名称作为短名称或长系统位置传递。

3. 设置波特率 setBaudRate

bool setBaudRate(qint32 baudRate, Directions directions = AllDirections);
qint32 baudRate(Directions directions = AllDirections) const;

QSerialPort 提供的设置波特率的函数,对应此属性保留所需方向的数据波特率。

如果设置成功或在打开端口之前设置,则返回“真”;否则返回“假”,并设置一个错误代码,可以通过访问qserialport::error属性的值来获取该代码。要设置波特率,请使用枚举QSerialPort::BaudRate或任何正qint32值。

注意:如果在打开端口之前设置了该设置,则实际的串行端口设置将在qserialPort::open()方法中自动完成,然后端口打开成功。

默认值为baud9600,即每秒9600位。

4. 设置数据位 setDataBits

bool setDataBits(DataBits dataBits);
DataBits dataBits() const;

QSerialPort 提供的数据位的函数。
设置数据的函数,此属性将数据位保存在帧中。

如果设置成功或在打开端口之前设置,则返回“true”;否则返回“false”,并设置一个错误代码,可以通过访问 QSerialPort::error 属性的值来获取该代码。

注意:如果在打开端口之前设置了该设置,则实际的串行端口设置将在QSerialPort::open() 方法中自动完成,然后端口打开成功。

默认值为QSerialPort::Data8,即8个数据位。

数据位使用的是QT提供的枚举:QSerialPort::DataBits

5. 设置奇偶效验位 setParity

bool setParity(Parity parity);
Parity parity() const;

QSerialPort 提供的设置奇偶校验函数,此属性保持奇偶校验模式。
如果设置成功或在打开端口之前设置,则返回“true”;否则返回“false”,并设置一个错误代码,可以通过访问QSerialPort::error 属性的值来获取该代码。

注意:如果在打开端口之前设置了该设置,则实际的串行端口设置将在**QSerialPort::open()**方法中自动完成,然后端口打开成功。

默认值为NoParity,即无奇偶校验。

6. 设置停止位 setStopBits

bool setStopBits(StopBits stopBits);
StopBits stopBits() const;

QSerialPort 提供的 设置停止位的函数,此属性保存帧中的停止位数。
如果设置成功或在打开端口之前设置,则返回“true”;否则返回“false”,并设置一个错误代码,可以通过访问QSerialPort::error 属性的值来获取该代码。

注意:如果在打开端口之前设置了该设置,则实际的串行端口设置将在**QSerialPort::open()**方法中自动完成,然后端口打开成功。

默认值为***OneStop***,即1个停止位。

7. 设置控制流模式 setFlowControl

bool setFlowControl(FlowControl flowControl);
FlowControl flowControl() const;

QSerialPort 提供的 设置控制流模式的函数,此属性保持所需的流控制模式。
默认值为NoFlowControl,即没有流控制。

8. 链接接受数据信号 readyRead

//!接收到数据信号
[signal] void QIODevice::readyRead()

QSerialPort* 提供的 每当有新数据可用于从设备的当前读取通道读取时,就会发出此信号。 仅当有新数据可用时(例如,当网络套接字上有新的网络数据有效负载时,或将新的数据块附加到设备上时),才会再次发出该数据。
readyRead() 不会递归地发出; 如果您重新进入事件循环或在连接到 readyRead() 信号的插槽内调用 waitForReadyRead() ,则不会重新发出该信号(尽管 ** waitForReadyRead()** 可能仍返回true)。
对于实现从QIODevice派生的类的开发人员请注意:当新数据到达时,您应该始终发出readyRead()(不要仅仅因为缓冲区中仍有待读取的数据而发出它)。 在其他情况下不要发出readyRead()
另请参见bytesWritten()

注:这个信号是 QSerialPort 从QIODevice 继承的。

9. 链接发送数据信号 bytesWritten

//! 写入数据信号数据信号
[signal] void QIODevice::bytesWritten(qint64 bytes)

QSerialPort* 提供的 每次将数据的有效负载写入设备的当前写入通道时,都会发出此信号。bytes参数被设置为在这个有效负载中写入的字节数。

实例 一

#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
#include <QApplication>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        qDebug() << "端口名称:" << info.portName();
        qDebug() << "描述 : " << info.description();
        qDebug() << "制造商: " << info.manufacturer();
        qDebug() << "序号: " << info.serialNumber();
        qDebug() << "系统的位置:" << info.systemLocation();
    }
    return a.exec();
}

实例 二

#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
#include <QApplication>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSerialPort *serial = new QSerialPort;
    serial->setPortName("COM2");
    bool opt = serial->open(QIODevice::ReadWrite);
    if(opt){
        qDebug()<<"打开成功";
    }else {
         qDebug()<<"打开失败";
}
    //设置波特率
    serial->setBaudRate(QSerialPort::Baud115200);
    //设置数据位
    serial->setDataBits(QSerialPort::Data8);
    //设置奇偶效验位
    serial->setParity(QSerialPort::NoParity);
    //设置停止位
    serial->setStopBits(QSerialPort::OneStop);
    //设置流模式
    serial->setFlowControl(QSerialPort::NoFlowControl);
    
    //简单写入数据
    serial->write("我在写数据");

    return a.exec();
}
  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值