Qt QSerialPort数据发送和接收DataComm

文章目录

    • [Qt QSerialPort数据发送和接收DataComm](#Qt QSerialPort数据发送和接收DataComm)
    • [2.添加 Qt Serial Port 模块](#2.添加 Qt Serial Port 模块)
    • 3.实例源码

Qt QSerialPort数据发送和接收DataComm

Qt 框架的Qt Serial Port 模块提供了访问串口的基本功能,包括串口通信参数配置和数据读写,使用 Qt Serial Port 模块就可以很方便地编写具有串口通信功能的应用程序。

  1. 创建一个基于QMainWindow应用程序

2.添加 Qt Serial Port 模块

Qt Serial Port 模块用于串口通信编程,要在一个项目中使用 Qt Serial Port 模块,需要在项目配置文件中加入一行语句:QT += serialport

Qt Serial Port 模块中只包含有两个类:QSerialPortInfo QSerialPort

3.实例源码

头文件datacomm.h

C++ 复制代码
#ifndef DATACOMM_H
#define DATACOMM_H

#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui {
class DataComm;
}
QT_END_NAMESPACE

class DataComm : public QMainWindow
{
    Q_OBJECT

public:
    DataComm(QWidget *parent = nullptr);
    ~DataComm();
private slots:
    void clear_recv();
    void clear_send();
    void on_com_recv();
    void on_com_send();
    void on_com_open();
    void on_com_changed(int index);
    void on_timeout();
    void on_check_state_changed(int);
    void get_interval();
private:
    void send();

    Ui::DataComm *ui;
    QSerialPort comPort;
    bool bCircle;
    int interval;
    QTimer *timer;
    QByteArray stdCmd;
    QString strCmd;
};
#endif // DATACOMM_H

源文件datacomm.cpp

C++ 复制代码
#include "datacomm.h"
#include "ui_datacomm.h"
#include <QMessageBox>


DataComm::DataComm(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::DataComm)
{
    ui->setupUi(this);

    foreach (QSerialPortInfo portInfo, QSerialPortInfo::availablePorts()) {
        ui->comboBoxPort->addItem(portInfo.portName());
    }
    ui->comboBoxPort->setCurrentIndex(2);
    connect(ui->comboBoxPort,SIGNAL(currentIndexChanged(int)),this,SLOT(on_com_changed(int)));

    ui->pushButtonOpen->setEnabled(ui->comboBoxPort->count()>0);
    ui->pushButtonSend->setEnabled(false);
    connect(ui->pushButtonOpen,SIGNAL(clicked()),this,SLOT(on_com_open()));
    connect(ui->pushButtonSend,SIGNAL(clicked()),this,SLOT(on_com_send()));
    ui->comboBoxBaud->clear();
    foreach (qint32 baud, QSerialPortInfo::standardBaudRates()) {
        ui->comboBoxBaud->addItem(QString::number(baud));
    }
    ui->comboBoxBaud->setCurrentText("9600");

    ui->comboBoxCheck->addItem("NONE");
    ui->comboBoxCheck->addItem("ODD");
    ui->comboBoxCheck->addItem("EVEN");
    ui->comboBoxCheck->addItem("SPACE");
    ui->comboBoxCheck->addItem("MARK");

    ui->comboBoxFlowCtrl->addItem("NONE");
    ui->comboBoxFlowCtrl->addItem("HARD");
    ui->comboBoxFlowCtrl->addItem("SOFT");


    ui->comboBoxDataBit->addItem("5");
    ui->comboBoxDataBit->addItem("6");
    ui->comboBoxDataBit->addItem("7");
    ui->comboBoxDataBit->addItem("8");
    ui->comboBoxDataBit->setCurrentText("8");

    ui->comboBoxStopBit->addItem("1");
    ui->comboBoxStopBit->addItem("1.5");
    ui->comboBoxStopBit->addItem("2");


    timer = new QTimer(this);
    ui->lineEditTime->setText("1000");
    interval = 1000;

    connect(ui->pushButtonClearRecv,&QPushButton::clicked,this,&DataComm::clear_recv);
    connect(ui->pushButtonClearSend,&QPushButton::clicked,this,&DataComm::clear_send);

    connect(timer,&QTimer::timeout,this,&DataComm::on_timeout);
    connect(ui->lineEditTime,&QLineEdit::textChanged,this,&DataComm::get_interval);

    connect(&comPort,&QIODevice::readyRead,this,&DataComm::on_com_recv);
    connect(ui->checkBoxCircle,&QCheckBox::stateChanged,this,&DataComm::on_check_state_changed);
    resize(800,600);
}

DataComm::~DataComm()
{
    delete ui;
}

void DataComm::clear_recv()
{
    ui->plainTextEditRecv->clear();
}

void DataComm::clear_send()
{
    ui->plainTextEditSend->clear();
}
void DataComm::on_com_open()
{
    if(comPort.isOpen()) {
        comPort.close();
        ui->comboBoxPort->setEnabled(true);
        ui->comboBoxBaud->setEnabled(true);
        ui->comboBoxCheck->setEnabled(true);
        ui->comboBoxDataBit->setEnabled(true);
        ui->comboBoxStopBit->setEnabled(true);
        ui->comboBoxFlowCtrl->setEnabled(true);
        ui->pushButtonSend->setEnabled(false);
        ui->pushButtonOpen->setText("打开");
    }
    else {

        int index = ui->comboBoxPort->currentIndex();
        QList<QSerialPortInfo> comList = QSerialPortInfo::availablePorts();
        QSerialPortInfo portInfo = comList.at(index);
        comPort.setPort(portInfo);
        comPort.setReadBufferSize(2048);
        comPort.setBaudRate(ui->comboBoxBaud->currentText().toInt());
        int value = ui->comboBoxDataBit->currentText().toInt();
        comPort.setDataBits(QSerialPort::DataBits(value));

        value = ui->comboBoxCheck->currentText().toInt();
        if(value != 0) {
            value ++;
        }
        comPort.setParity(QSerialPort::Parity(value));

        value = ui->comboBoxStopBit->currentText().toInt();
        comPort.setStopBits(QSerialPort::StopBits(value));
        value = ui->comboBoxFlowCtrl->currentText().toInt();
        comPort.setFlowControl(QSerialPort::FlowControl(value));
        if(comPort.open(QIODevice::ReadWrite)) {
            ui->comboBoxPort->setEnabled(false);
            ui->comboBoxBaud->setEnabled(false);
            ui->comboBoxCheck->setEnabled(false);
            ui->comboBoxDataBit->setEnabled(false);
            ui->comboBoxStopBit->setEnabled(false);
            ui->comboBoxFlowCtrl->setEnabled(false);
            ui->pushButtonSend->setEnabled(true);
            ui->pushButtonOpen->setText("关闭");
        }
    }
}

void DataComm::get_interval()
{
    int val = ui->lineEditTime->text().toInt();
    if(val > 0) {
        interval = val;
    }
    else {
        ui->lineEditTime->setText(QString::number(interval));
    }
}

void DataComm::on_check_state_changed(int)
{
    bCircle = ui->checkBoxCircle->isChecked();
    if(!bCircle) {
        if(timer->isActive()) {
            timer->stop();
            ui->pushButtonSend->setEnabled(true);
        }
    }
}
void DataComm::send()
{
    ui->plainTextEditRecv->appendPlainText("Tx: "+ strCmd );
    comPort.write((const QByteArray )stdCmd);
}

void DataComm::on_com_send()
{
    strCmd =  ui->plainTextEditSend->toPlainText();
    if(strCmd.isEmpty()) {
        QMessageBox::information(this,tr("发送内容为空"),tr("发送内容为空!"));
        return;
    }
    QByteArray ba = QByteArray (strCmd.toUtf8());
    stdCmd = ba;
    send();
    bCircle = ui->checkBoxCircle->isChecked();
    if(bCircle) {
        ui->pushButtonSend->setEnabled(false);
        timer->start(interval);
    }
}

void DataComm::on_timeout()
{
    send();
}

void DataComm::on_com_recv()
{
    if(comPort.bytesAvailable()) {
        comPort.waitForReadyRead(100);
        QByteArray all = comPort.read(1024);
        QString str(all);
        if(!str.isEmpty()){
            ui->plainTextEditRecv->appendPlainText("Rx: "+ str );
        }
    }
}

void DataComm::on_com_changed(int index)
{

}

源文件main.cpp

C++ 复制代码
#include "datacomm.h"

#include <QApplication>
#include <QLocale>
#include <QTranslator>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTranslator translator;
    const QStringList uiLanguages = QLocale::system().uiLanguages();
    for (const QString &locale : uiLanguages) {
        const QString baseName = "DataCom_" + QLocale(locale).name();
        if (translator.load(":/i18n/" + baseName)) {
            a.installTranslator(&translator);
            break;
        }
    }
    DataComm w;
    w.show();
    return a.exec();
}

nguages) {

const QString baseName = "DataCom_" + QLocale(locale).name();

if (translator.load(":/i18n/" + baseName)) {

a.installTranslator(&translator);

break;

}

}

DataComm w;

w.show();

return a.exec();

}

复制代码
相关推荐
Ajiang282473530436 分钟前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
‘’林花谢了春红‘’5 小时前
C++ list (链表)容器
c++·链表·list
----云烟----6 小时前
QT中QString类的各种使用
开发语言·qt
机器视觉知识推荐、就业指导7 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
Yang.999 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
熬夜学编程的小王9 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
zz40_9 小时前
C++自己写类 和 运算符重载函数
c++
六月的翅膀9 小时前
C++:实例访问静态成员函数和类访问静态成员函数有什么区别
开发语言·c++
liujjjiyun10 小时前
小R的随机播放顺序
数据结构·c++·算法