Porta serial Qt para enviar e receber dados

O seguinte começa a introduzir o uso da classe de porta serial.

Em primeiro lugar, o QT5 vem com a classe QSerialPort. Ao usá-lo, você precisa adicionar uma linha no arquivo pro:

QT       += serialport

Em seguida, consulte diretamente o arquivo de cabeçalho e você poderá usá-lo.

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

QSerialPort: Fornece acesso a portas seriais

QSerialPortInfo: Fornece informações sobre as portas seriais existentes no sistema

Em seguida, você precisa criar um objeto QSerialPort, definir o nome da porta serial, taxa de transmissão, bits de dados, bits de paridade, bits de parada e outros parâmetros e, em seguida, executar as operações de leitura e gravação da porta serial.
Resumiu aproximadamente o processo de configuração, leitura e escrita.

Os benefícios deste artigo, grátis para receber o pacote de materiais de aprendizado de desenvolvimento Qt, vídeo técnico, incluindo (projeto de combate real Qt, base da linguagem C++, modo de design C++, introdução à programação Qt, sinal QT e mecanismo de slot, desenho de imagem de desenvolvimento de interface QT , rede QT, programação de banco de dados QT, combate de projeto QT, QSS, OpenCV, módulo rápido, perguntas de entrevista, etc.) ↓↓↓↓↓↓Veja abaixo↓↓Clique na parte inferior do artigo para receber a taxa↓↓

1. Configurações (exemplo)

QSerialPort *serial = new QSerialPort;
//设置串口名
serial->setPortName(name);
//打开串口
serial->open(QIODevice::ReadWrite);
//设置波特率
serial->setBaudRate(BaudRate);
//设置数据位数
serial->setDataBits(QSerialPort::Data8);
 //设置奇偶校验
 serial->setParity(QSerialPort::NoParity);
//设置停止位
serial->setStopBits(QSerialPort::OneStop);
//设置流控制
serial->setFlowControl(QSerialPort::NoFlowControl);

Aqui defina o nome da porta serial, abra a porta serial e defina-a como legível e gravável, a taxa de transmissão é BaudRate, o bit de dados é de 8 bits, não há bit de paridade, o bit de parada é de 1 bit e há sem controle de fluxo. Depois de configurá-los, você pode realizar operações de leitura e gravação. Como novato, descobri que não sabia como selecionar palavras-chave no QtCreator, pressione F1 para abrir o documento para ver o manual de classes, funções e outros dados.

2. Leia os dados

void MainWindow::Read_Data()
{
    QByteArray buf;
    buf = serial->readAll();
}

Quando a porta serial receber dados e concluir a recepção, ela enviará um sinal readyRead(), então você só precisa escrever uma função de slot Read_Data(), definir o slot de sinal e usar readAll() na função de slot para ler o dados recebidos em buf.

3. Envie dados

serial->write(data);  

Use a função de gravação para enviar os dados da string byte por byte.

Apenas as etapas acima são necessárias para usar a porta serial e só precisam ser executadas após o uso

serial->close();

Você pode fechar a porta serial. Eu usei o design da interface ui para escrever o computador superior, a interface é a seguinte:

 

código mostra como abaixo:

//mianwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDebug>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void on_clearButton_clicked();
    void on_sendButton_clicked();
    void on_openButton_clicked();
    void Read_Data();
private:
    Ui::MainWindow *ui;
    QSerialPort *serial;
};
#endif // MAINWINDOW_H
//mainwindow.c
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //查找可用的串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
            ui->PortBox->addItem(serial.portName());
            serial.close();
        }
    }
    //设置波特率下拉菜单默认显示第三项
    ui->BaudBox->setCurrentIndex(3);
    //关闭发送按钮的使能
    ui->sendButton->setEnabled(false);
    qDebug() << tr("界面设定成功!");
}
MainWindow::~MainWindow()
{
    delete ui;
}
//清空接受窗口
void MainWindow::on_clearButton_clicked()
{
    ui->textEdit->clear();
}
//发送数据
void MainWindow::on_sendButton_clicked()
{
    serial->write(ui->textEdit_2->toPlainText().toLatin1());
}
//读取接收到的数据
void MainWindow::Read_Data()
{
    QByteArray buf;
    buf = serial->readAll();
    if(!buf.isEmpty())
    {
        QString str = ui->textEdit->toPlainText();
        str+=tr(buf);
        ui->textEdit->clear();
        ui->textEdit->append(str);
    }
    buf.clear();
}
void MainWindow::on_openButton_clicked()
{
    if(ui->openButton->text()==tr("打开串口"))
    {
        serial = new QSerialPort;
        //设置串口名
        serial->setPortName(ui->PortBox->currentText());
        //打开串口
        serial->open(QIODevice::ReadWrite);
        //设置波特率
        serial->setBaudRate(ui->BaudBox->currentText().toInt());
        //设置数据位数
        switch(ui->BitNumBox->currentIndex())
        {
        case 8: serial->setDataBits(QSerialPort::Data8); break;
        default: break;
        }
        //设置奇偶校验
        switch(ui->ParityBox->currentIndex())
        {
        case 0: serial->setParity(QSerialPort::NoParity); break;
        default: break;
        }
        //设置停止位
        switch(ui->StopBox->currentIndex())
        {
        case 1: serial->setStopBits(QSerialPort::OneStop); break;
        case 2: serial->setStopBits(QSerialPort::TwoStop); break;
        default: break;
        }
        //设置流控制
        serial->setFlowControl(QSerialPort::NoFlowControl);
        //关闭设置菜单使能
        ui->PortBox->setEnabled(false);
        ui->BaudBox->setEnabled(false);
        ui->BitNumBox->setEnabled(false);
        ui->ParityBox->setEnabled(false);
        ui->StopBox->setEnabled(false);
        ui->openButton->setText(tr("关闭串口"));
        ui->sendButton->setEnabled(true);
        //连接信号槽
        QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);
    }
    else
    {
        //关闭串口
        serial->clear();
        serial->close();
        serial->deleteLater();
        //恢复设置使能
        ui->PortBox->setEnabled(true);
        ui->BaudBox->setEnabled(true);
        ui->BitNumBox->setEnabled(true);
        ui->ParityBox->setEnabled(true);
        ui->StopBox->setEnabled(true);
        ui->openButton->setText(tr("打开串口"));
        ui->sendButton->setEnabled(false);
    }
}
//main.c
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

Os benefícios deste artigo, grátis para receber o pacote de materiais de aprendizado de desenvolvimento Qt, vídeo técnico, incluindo (projeto de combate real Qt, base da linguagem C++, modo de design C++, introdução à programação Qt, sinal QT e mecanismo de slot, desenho de imagem de desenvolvimento de interface QT , rede QT, programação de banco de dados QT, combate de projeto QT, QSS, OpenCV, módulo rápido, perguntas de entrevista, etc.) ↓↓↓↓↓↓Veja abaixo↓↓Clique na parte inferior do artigo para receber a taxa↓↓

Acho que você gosta

Origin blog.csdn.net/m0_73443478/article/details/132188625
Recomendado
Clasificación