用Qt 5写一个串口收发桌面工具

今天用Qt写了一个串口收发工具,记录下整个流程。

1、项目工程布局

2、ui文件布局

3、widget.h文件

#ifndef WIDGET_H
#define WIDGET_H

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



QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    QSerialPort *pSerialPort;
    QByteArray recvData;


};
#endif // WIDGET_H

4、widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox>
#include <QFileDialog>
#include <QFile>
#include <QTextStream>


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


    ui->widget->setWindowTitle("串口助手");
    pSerialPort = NULL;


    //枚举识别到的com口
    //写法一:
   /* foreach(QSerialPortInfo info,QSerialPortInfo::availablePorts())//读串口
    {

        QSerialPort port;

        port.setPort(info);

        if(port.open(QIODevice::ReadWrite))//如果串口可以读写的形式打开
        {
            ui->comboBox_portName->addItem(info.portName()); //显示出来

            port.close();//自动关闭等待人为打开
        }
    }*/
    //写法二
    QList<QSerialPortInfo> seriList = QSerialPortInfo::availablePorts();

    for(int i = 0;i <seriList.count();i++ )
    {
        QSerialPort port;

        port.setPort(seriList.at(i));

        if(port.open(QIODevice::ReadWrite))
        {
            ui->comboBox_portName->addItem(seriList.at(i).portName());

            port.close();
        }
    }


    //信号槽连接打开按钮和相关处理操作
    connect(ui->openBtn,&QPushButton::clicked,[=](){

        if(pSerialPort != NULL)
        {
            QMessageBox::warning(this,"警告","已有活跃串口,请先关闭再打开");

            return;
        }

        pSerialPort = new QSerialPort(this);

        pSerialPort->setPortName(ui->comboBox_portName->currentText());
        pSerialPort->open(QIODevice::ReadWrite);
        pSerialPort->setBaudRate(ui->comboBox_bandRate->currentText().toInt());
        pSerialPort->setDataBits(QSerialPort::Data8);
        pSerialPort->setParity(QSerialPort::NoParity);
        pSerialPort->setFlowControl(QSerialPort::NoFlowControl);
        pSerialPort->setStopBits(QSerialPort::OneStop);

        connect(pSerialPort,&QSerialPort::readyRead,this,[=](){

            recvData = pSerialPort->readAll();

            if(!recvData.isEmpty())
            {
                ui->textEdit_read->append(recvData);
            }

            recvData.clear();

        });

    });

    //发送数据信号槽连接
    connect(ui->sendBtn,&QPushButton::clicked,this,[=](){

        if(NULL ==  pSerialPort )
            return;
        pSerialPort->write(ui->lineEdit_write->text().toUtf8());

        ui->lineEdit_write->clear();

    });

    //清空按钮信号槽连接
    connect(ui->clearBtn,&QPushButton::clicked,this,[=](){

        ui->textEdit_read->clear();
    });


    //关闭串口按钮信号槽连接
    connect(ui->closeBtn,&QPushButton::clicked,this,[=](){

        pSerialPort->close();

        delete pSerialPort;

        pSerialPort = NULL;
    });


    //保存按钮信号槽连接
    connect(ui->saveBtn,&QPushButton::clicked,this,[=](){
        if(ui->textEdit_read->document()->isEmpty())
        {
            QMessageBox::warning(this,"警告","记录不能为空");

            return;
        }

        QString path = QFileDialog::getSaveFileName(this,"保存log记录","log记录","(*.txt)");

        qDebug()<<path;


        if (path.isEmpty())
        {
            QMessageBox::warning(this,"路径","路径不能为空");

            return ;
        }

        QFile file(path);

        file.open(QIODevice::WriteOnly|QIODevice::Text);

        QTextStream stream(&file);


        stream<<ui->textEdit_read->toPlainText();

        file.close();

    });


    ui->lineEdit_write->setFocus();

}

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

5、main.cpp 文件

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

6、Serial.pro中要加入 serialport 模块

7.运行效果(电脑上外接串口,然后串口Tx和Rx短接,用作自发自收)

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 好的。 首先,你需要打开Qt Creator,然后在文件菜单中选择 "新建文件或项目"。在弹出的对话框中选择 "应用程序",然后选择 "控制台应用程序"。 接下来,你需要在工程中添加串口功能。在 "项目" 视图中右键单击你的工程,然后选择 "添加库"。在弹出的对话框中,选择 "Qt Serial Port" 库并点击 "下一步"。 然后,你需要在代码中包含串口头文件: ``` #include <QSerialPort> ``` 接下来,你可以使用 QSerialPort 类来打开、关闭和操作串口。例如,你可以使用以下代码打开串口: ``` QSerialPort serialPort; serialPort.setPortName("COM1"); if (serialPort.open(QIODevice::ReadWrite)) { // 串口打开成功 } else { // 串口打开失败 } ``` 你还可以使用以下代码来读串口数据: ``` // 入数据 QByteArray data; serialPort.write(data); // 读取数据 QByteArray data = serialPort.readAll(); ``` 最后,你需要在程序结束时关闭串口: ``` serialPort.close(); ``` 希望这些信息能帮到你。 ### 回答2: 好的,下面是一个简单的Qt串口工具的代码示例: ``` #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QCoreApplication> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 获取可用串口信息 QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts(); qDebug() << "可用串口列表:"; foreach(const QSerialPortInfo &port, ports) { qDebug() << port.portName(); } // 创建串口对象 QSerialPort serial; // 设置串口名字和波特率 serial.setPortName("COM1"); serial.setBaudRate(QSerialPort::Baud9600); // 打开串口 if (!serial.open(QIODevice::ReadWrite)) { qDebug() << "无法打开串口"; return 1; } // 读取数据 QObject::connect(&serial, &QSerialPort::readyRead, [&]() { QByteArray data = serial.readAll(); qDebug() << "接收到数据:" << data; }); // 发送数据 QByteArray sendData = "Hello!"; qint64 bytesWritten = serial.write(sendData); qDebug() << "发送数据:" << sendData << ", 发送字节数:" << bytesWritten; return a.exec(); } ``` 这是一个简单的串口工具,它可以列出可用的串口并选择一个串口进行通信。它还会接收来自串口的数据并发送指定的数据。 注意:为了使用QtSerialPort模块,请确保在.pro文件中添加以下行: ``` QT += serialport ``` 请根据您的需求进行进一步的修改和扩展。 ### 回答3: Qt一个面向对象的跨平台开发框架,可以用来开发各种应用程序,包括串口工具。下面是一个简单的示例,演示如何使用Qt一个串口工具。 首先,我们需要在Qt Creator中创建一个新的Qt Widgets应用程序项目。然后,在主窗口上放置一个文本框用于显示收到的串口数据,一个按钮用于打开/关闭串口,以及一些下拉框和按钮用于设置串口参数,如波特率、数据位、停止位和校验位。 接下来,在主控制类中,我们需要使用Qt串口类进行串口通信。首先,我们通过调用QSerialPortInfo的静态函数availablePorts()获取可用的串口列表,并将其填充到下拉框中。然后,当用户点击打开/关闭串口按钮时,我们根据用户的选择创建一个QSerialPort对象,并根据用户在下拉框中选择的参数设置串口参数。当串口打开时,我们使用QSerialPort的readyRead()信号来接收串口数据,并在文本框中显示。 此外,我们还需要对按钮的点击事件进行处理。当用户点击打开按钮时,我们尝试打开串口并更改按钮的文本为“关闭串口”,当用户点击关闭按钮时,我们关闭串口并更改按钮的文本为“打开串口”。 这只是一个简单的示例,你可以根据自己的需求扩展功能。希望这个回答对你有所帮助,如果你需要更详细的代码或进一步的解释,请随时告诉我。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KiranWang

一起努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值