- QSerialPort:提供访问串口的功能
- QSerialPortInfo:提供系统中存在的串口的信息
首先需要在pro文件中加入:QT += serialport
QSerialPort类
1.构造函数:
- QSerialPort(QObject *parent = nullptr)
- QSerialPort(const QString &name, QObject *parent = nullptr)
- QSerialPort(const QSerialPortInfo &serialPortInfo, QObject *parent = nullptr)
2.其他功能函数:
- qint32 baudRate(QSerialPort::Directions directions) //获取波特率
- QSerialPort::DataBits dataBits() //获取数据位保存在帧中
- QSerialPort::FlowControl flowControl() //获取所需的流控制模式
- QSerialPort::Parity parity() //获取奇偶校验
- QString portName() //获取串口名字
- QSerialPort::StopBits stopBits() //获取停止位
- QSerialPort::PinoutSignals pinoutSignals()//以位图格式返回线信号的状态
- bool sendBreak(int duration = 0)//如果终端使用异步串行数据,则在指定的持续时间内发送零位的连续流(以毫秒为单位)。如果成功,则返回 true;否则返回假。
- bool setBaudRate(qint32 baudRate, QSerialPort::Directions directions)//设置波特率
参数:
- QSerialPort::Baud1200
- QSerialPort::Baud2400
- QSerialPort::Baud4800
- QSerialPort::Baud9600
- QSerialPort::Baud19200
- QSerialPort::Baud38400
- QSerialPort::Baud57600
- QSerialPort::Baud115200
- QSerialPort::UnknownBaud
- bool setBreakEnabled(bool set = true)//设置传输线的状态处于中断状态
- bool setDataBits(QSerialPort::DataBits dataBits)//设置数据位,一般被8位
参数:
- QSerialPort::Data5
- QSerialPort::Data6
- QSerialPort::Data7
- QSerialPort::Data8
- QSerialPort::UnknownDataBits
- bool setDataTerminalReady(bool set)//设置线路信号 DTR 的状态(高电平或低电平)
- bool setFlowControl(QSerialPort::FlowControl flowControl)//设置流控制 一般为0
参数:
- QSerialPort::NoFlowControl
- QSerialPort::HardwareControl
- QSerialPort::SoftwareControl
- QSerialPort::UnknownFlowControl
- bool setParity(QSerialPort::Parity parity)//设置奇偶校验 一般为0
参数:
- QSerialPort::NoParity
- QSerialPort::EvenParity
- QSerialPort::OddParity
- QSerialPort::SpaceParity
- QSerialPort::MarkParity
- QSerialPort::UnknownParity
- void setPort(const QSerialPortInfo &serialPortInfo)//设置串口
- QList<QSerialPortInfo> availablePorts()//返回系统上可用串行端口的列表。
例如:
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
serial->setPort(info);
}
- void setPortName(const QString &name)//设置串口名
- void setReadBufferSize(qint64 size)//将 QSerialPort 的内部读取缓冲区的大小设置为大小字节。
- bool setRequestToSend(bool set)//设置线路信号 RTS 的状态(高电平或低电平)
- bool setStopBits(QSerialPort::StopBits stopBits)//设置停止位 一般为1
参数:
- QSerialPort::OneStop//1
- QSerialPort::OneAndHalfStop//3
- QSerialPort::TwoStop//2
- QSerialPort::UnknownStopBits
- qint64 QIODevice::write(const char *data, qint64 maxSize)//最多将最大大小数据字节从数据写入设备。返回实际写入的字节数,如果发生错误,则返回 -1。
3.静态成员函数:
- virtual qint64 bytesToWrite() //如果可以从串行端口读取一行数据,则返回 true;否则返回假。
- virtual bool open(QIODevice::OpenMode mode) override//打开设备并将其打开模式设置为模式。
参数:
- QIODevice::NotOpen
- QIODevice::ReadOnly
- QIODevice::WriteOnly
- QIODevice::ReadWrite//读写
- QIODevice::Append
- QIODevice::Truncate
- QIODevice::Text
- QIODevice::Unbuffered
- QIODevice::NewOnly
- QIODevice::ExistingOnly
4.信号:
- void baudRateChanged(qint32 baudRate, QSerialPort::Directions directions)//该信号在波特率改变后发出。新的波特率作为波特率传递,方向作为方向传递。
- void dataBitsChanged(QSerialPort::DataBits dataBits)//该信号在帧中的数据位更改后发出。帧中的新数据位作为数据位传递。
- void QIODevice::readyRead()//每当有新数据可用于从设备的当前读取通道读取时,他的信号都会发出一次。只有在新数据可用时,例如当新的网络数据有效负载到达网络套接字时,或者当新数据块附加到设备时,它才会再次发出。
串口实例:
- serial.h文件
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include<QSerialPortInfo>
#include<QSerialPort>
#include<QDebug>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = nullptr);
~Dialog();
private slots:
void on_pushButton_clicked();
void read_data();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
void on_pushButton_5_clicked();
private:
Ui::Dialog *ui;
QSerialPort *serial=new QSerialPort;
};
#endif // DIALOG_H
- serial.cpp文件
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
ui->comboBox_2->setCurrentIndex(0);
on_pushButton_5_clicked();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_pushButton_clicked()
{
serial->setPortName(ui->comboBox->currentText());
serial->setBaudRate(ui->comboBox_2->currentText().toInt());
if(serial->open(QIODevice::ReadWrite))
{
qDebug()<<"打开成功"<<endl;
connect(serial,SIGNAL(readyRead()),this,SLOT(read_data()));
}
else {
qDebug()<<"打开失败"<<endl;
}
}
void Dialog::read_data()
{
QByteArray byte=serial->readAll();
ui->textEdit_2->insertPlainText(byte);
qDebug()<<serial->readAll()<<endl;
}
void Dialog::on_pushButton_2_clicked()
{
serial->close();
qDebug()<<"关闭串口"<<endl;
}
void Dialog::on_pushButton_3_clicked()
{
serial->write(ui->textEdit->toPlainText().toUtf8());
}
void Dialog::on_pushButton_4_clicked()
{
ui->textEdit_2->clear();
}
void Dialog::on_pushButton_5_clicked()
{
ui->comboBox->clear();
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
ui->comboBox->addItem(info.portName());
}
}
ui图