QT编写串口调试助手实现串口通信

QT编写串口调试助手实现串口通信


在这里插入图片描述

qt项目

一、.pro文件添加串口
添加模块:

  QT +=  serialport

二、mainwindow.h
添加头文件:

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

实例化类,添加槽函数:按钮可直接转到槽,自己定义的槽函数要在private slots声名

   private:
        QSerialPort *serial;
   private slots:
        void ReadData();
        void SendData();
        void on_pushButton_findcom_clicked();
        void on_pushButton_opencom_clicked()

三、mainwindow.cpp

#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(0); // 115200
}

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

void MainWindow::on_openButton_clicked()
{
    if(ui->openButton->text()=="open")
    {
        mthread =new SerialThread(ui->PortBox->currentText(), ui->BaudBox->currentText().toInt());

        connect(mthread,SIGNAL(senddata(QByteArray)),this,SLOT(on_showData(QByteArray)),Qt::QueuedConnection);

        //接收子线程传输数据的信号

        mthread->run();//开启子线程

        //关闭设置菜单使能
        ui->PortBox->setEnabled(false);
        ui->BaudBox->setEnabled(false);

        ui->openButton->setText("close");
    }
    else
    {
        //关闭串口
        mthread->close_mthread_serial();

        //恢复设置使能
        ui->PortBox->setEnabled(true);
        ui->BaudBox->setEnabled(true);
        ui->openButton->setText("open");
    }
}

void MainWindow::on_showData(QByteArray value)
{
    ui->textEdit->append(value);
}

四、mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QThread>
#include "serialthread.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_openButton_clicked();

    void on_showData(QByteArray value);

private:
    Ui::MainWindow *ui;
    QSerialPort *serial;
    SerialThread *mthread;
};

#endif // MAINWINDOW_H


serialthread.cpp

#include "serialthread.h"

SerialThread::SerialThread(QString port, long baud)
{
    myport = port;
    myBaud = baud;
}


void SerialThread::run()

{
    //重写run()函数初始化串口
    serial = new QSerialPort();

    serial->setPortName(myport);

    serial->open(QIODevice::ReadWrite);//读写方式打开

    serial->setBaudRate(myBaud);//波特率

    serial->setDataBits(QSerialPort::Data8);//数据位

    serial->setParity(QSerialPort::NoParity);//奇偶校验

    serial->setStopBits(QSerialPort::OneStop);//停止位

    serial->setFlowControl(QSerialPort::NoFlowControl);//控制位

    connect(serial, SIGNAL(readyRead()), this, SLOT(read_serial_data()), Qt::QueuedConnection);//有数据就读

}

void SerialThread::read_serial_data()
{
    if(serial->bytesAvailable()>= 9)
    {
        QByteArray temp;

        temp = serial->read(9);//每串数据为9个字节

        emit senddata(temp);//发送数据给主线程

//      qDebug() << temp ;
      }
}

void SerialThread::close_mthread_serial(void)

{
    qDebug() <<"close ok"<<endl;

    serial->clear();

    serial->close();//关闭子线程

    serial->deleteLater();
}


serialthread.h

#ifndef SERIALTHREAD_H
#define SERIALTHREAD_H

#include <QObject>
#include <QThread>
#include <QWaitCondition>
#include <QMutex>
#include <QDebug>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>


class SerialThread : public QThread
{
    Q_OBJECT

public:
    SerialThread(QString port, long baud);

    void run();


signals:

    void senddata(QByteArray data);//向主线程发送接收到的串口数据

public slots:

    void read_serial_data();//读取串口数据

    void close_mthread_serial();//关闭

private:

    QSerialPort *serial;

    QString myport;
    long myBaud;

    float data;
};

#endif // SERIALTHREAD_H


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
与硬件通信的程序基本上要用到串口,虽然qt5以后集成了串口通信类,但是个人觉得那个串口通信类有点问题,在linux上表现很好,windows上大数据会有怪怪的问题出现,而且只能在qt5以上的版本才能用,无奈大部分的嵌入式linux上还停留在4.7.1到4.8.5左右的版本,所以本人一直喜欢用第三方的串口通信类做处理。 程序调试中经常需要串口调试,甚至还需要模拟设备数据回复,甚至串口转网络出去,特意将这些常用功能都做到一个串口调试助手中去。 基本功能: 1:支持16进制数据发送与接收。 2:支持windows下COM9以上的串口通信。 3:实时显示收发数据字节大小以及串口状态。 4:支持任意qt版本,亲测4.7.0 4.8.5 4.8.7 5.4.1 5.7.0 5.8.0。 5:支持串口转网络数据收发。 高级功能: 1:可自由管理需要发送的数据,每次只要从下拉框中选择数据即可,无需重新输入数据。 2:可模拟设备回复数据,需要在主界面开启模拟设备回复数据。当接收到设置好的指令时,立即回复设置的回复指令。例如指定收到0x16 0x00 0xFF 0x01需要回复0x16 0x00 0xFE 0x01,则只需要在SendData.txt中添加一条数据16 00 FF 01:16 00 FE 01即可。 3:可定时发送数据和保存数据到文本文件:,默认间隔5秒钟,可更改间隔时间。 4:在不断接收到大量数据时,可以暂停显示数据来查看具体数据,后台依然接收数据但不处理,无需关闭串口来查看已接收到的数据。 5:每次收到的数据都是完整的一条数据,而不是脱节的,做了延时处理。 6:一套源码随处编译,无需更改串口通信类,已在XP/WIN7/UBUNTU/ARMLINUX系统下成功编译并运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值