Qt 串口調試助手 實現16進制發送接收

主要用到了串口、保存配置、還有一個線程

QSerialPort、QSettings、QThread

使用串口要注意,再工程文件裏添加

QT += serialport

代碼我放上來了,編譯環境
在這裏插入圖片描述

演示

在這裏插入圖片描述

開了三個線程,一個線程用於串口,一個線程是主窗口,一個線程是保存數據,串口的線程通過信號將數據傳遞給主程序。
串口:
serialthread.h

#ifndef SERIALTHREAD_H
#define SERIALTHREAD_H

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

const int SERIAL_READ_BUFF = 1200;
class SerialThread : public QObject
{
    Q_OBJECT
public:
    explicit SerialThread(QObject *parent = nullptr);
    ~SerialThread();

    void initSerial();
    bool isOpenPort();
    void closePort();
    void getPortNum();//獲取串口號
    void handleSerialError(QSerialPort::SerialPortError error);
    bool openSerial(QString strPortNum, int nBaudRate,int nParityType,int nDataBits,int nStopBits,int nFlowCtrl);//打開串口
    void receiveData();//接收數據
    void writeData(QByteArray byteArray);//發送數據
private:
    QSerialPort *m_serial;        // 串口通信類對象
    QStringList CommPortList;     //串口號字符串
signals:
    void getcomPortList(QStringList CommPortList);//發送串口號字符串
    void linkError(QSerialPort::SerialPortError error);//連接錯誤
    void receData(QByteArray data,int length);//接收數據
};

#endif // SERIALTHREAD_H

serialthread.cpp

#include "serialthread.h"
#include <QDebug>
#include <QThread>
SerialThread::SerialThread(QObject *parent) : QObject(parent)
{
    initSerial();
}

SerialThread::~SerialThread()
{
    if(m_serial!=nullptr)
    {
        delete m_serial;
    }
}

void SerialThread::initSerial()
{
    m_serial = new QSerialPort(/*this*/);

    getPortNum();

//    connect(m_serial, static_cast<void (QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error), this, &SerialThread::handleSerialError);
    connect(m_serial, &QSerialPort::readyRead, this, &SerialThread::receiveData);
}

bool SerialThread::isOpenPort()
{
    if(m_serial->isOpen())
        return true;
    else
        return false;
}

void SerialThread::closePort()
{
    m_serial->close();
}

void SerialThread::getPortNum()
{
    if(!CommPortList.isEmpty())
        CommPortList.clear();
    //遍歷串口號保存
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        CommPortList.append(info.portName());
    }
    emit getcomPortList(CommPortList);
}

void SerialThread::handleSerialError(QSerialPort::SerialPortError error)
{
    if(error == QSerialPort::ResourceError)
    {
        emit linkError(error);
    }
}

bool SerialThread::openSerial(QString strPortNum, int nBaudRate, int nParityType, int nDataBits, int nStopBits, int nFlowCtrl)
{
    m_serial->setPortName(strPortNum);

    m_serial->setBaudRate(nBaudRate);

    switch (nParityType)
    {
    case 0:
        m_serial->setParity(QSerialPort::NoParity);
        break;
    case 1:
        m_serial->setParity(QSerialPort::OddParity);
        break;
    case 2:
        m_serial->setParity(QSerialPort::EvenParity);
        break;
    case 3:
        m_serial->setParity(QSerialPort::MarkParity);
        break;
    case 4:
        m_serial->setParity(QSerialPort::SpaceParity);
        break;
    default:
        m_serial->setParity(QSerialPort::UnknownParity);
        break;
    }

    switch (nDataBits)
    {
    case 5:
        m_serial->setDataBits(QSerialPort::Data5);
        break;
    case 6:
        m_serial->setDataBits(QSerialPort::Data6);
        break;
    case 7:
        m_serial->setDataBits(QSerialPort::Data7);
        break;
    case 8:
        m_serial->setDataBits(QSerialPort::Data8);
        break;
    default:
        m_serial->setDataBits(QSerialPort::UnknownDataBits);
        break;
    }

    switch (nStopBits)
    {
    case 0:
        m_serial->setStopBits(QSerialPort::OneStop);
        break;
    case 1:
        m_serial->setStopBits(QSerialPort::OneAndHalfStop);
        break;
    case 2:
        m_serial->setStopBits(QSerialPort::TwoStop);
        break;
    default:
        m_serial->setStopBits(QSerialPort::UnknownStopBits);
        break;
    }

    switch (nFlowCtrl)
    {
    case 0:
        m_serial->setFlowControl(QSerialPort::NoFlowControl);
        break;
    case 1:
        m_serial->setFlowControl(QSerialPort::HardwareControl);
        break;
    case 2:
        m_serial->setFlowControl(QSerialPort::SoftwareControl);
        break;
    default:
        m_serial->setFlowControl(QSerialPort::UnknownFlowControl);
        break;
    }

    if( !m_serial->open((QIODevice::ReadWrite)) )//打開失敗
    {
        return false;
    }

    m_serial->setReadBufferSize(SERIAL_READ_BUFF);
    return true;
}

void SerialThread::receiveData()
{
    m_serial->waitForReadyRead(10);
    QByteArray bytes = m_serial->readAll();

    emit receData(bytes,bytes.length());
}

void SerialThread::writeData(QByteArray byteArray)
{
    m_serial->write(byteArray);
}


保存數據
saveconfigthread.h

#ifndef SAVECONFIGTHREAD_H
#define SAVECONFIGTHREAD_H

#include <QObject>
#include <QSettings>
class SaveConfigThread : public QObject
{
    Q_OBJECT
public:
    explicit SaveConfigThread(QObject *parent = nullptr);
    ~SaveConfigThread();
    void WriteInit(QString key, QString value);
    void ReadInit(QString key, QString &value);
signals:
private:
    QSettings *saveConfig;
};

#endif // SAVECONFIGTHREAD_H


#include "saveconfigthread.h"

SaveConfigThread::SaveConfigThread(QObject *parent) : QObject(parent)
{
    QString path = "config.ini";

    //創建配置文件操作對象
    saveConfig = new QSettings(path, QSettings::IniFormat);
}

SaveConfigThread::~SaveConfigThread()
{
    if(saveConfig!=nullptr)
    {
        delete saveConfig;
    }
}

void SaveConfigThread::WriteInit(QString key, QString value)
{
    QString path = "config.ini";

    //將信息寫入配置文件
    saveConfig->beginGroup("config");
    saveConfig->setValue(key, value);
    saveConfig->endGroup();
}

void SaveConfigThread::ReadInit(QString key, QString &value)
{
    value = QString("");

    //讀取配置信息
    value = saveConfig->value(QString("config/") + key).toString();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章