基于Qt的串口调试工具&串口常见问题

1.项目地址

https://github.com/zhangjiechina001/SerialPortTool

2.使用注意

  1. 串口的所有参数波特率、数据位、校验位、停止位、控制流都需要设置正确,设置错了有时会连接上但是传输的数据会很奇怪,有时直接连接不上了

3.核心类

头文件

#ifndef SERIALPORTWRAP_H
#define SERIALPORTWRAP_H
#pragma execution_character_set("utf-8")
#include <QObject>
#include <QSerialPort>

class SerialPortWrap : public QObject
{
    Q_OBJECT
public:
    static QMap<QString,QSerialPort::Parity> getParityMap();

    static QMap<QString,QSerialPort::DataBits> getDataMap();

    static QMap<QString,QSerialPort::StopBits> getStopMap();

    static QMap<QString, QSerialPort::FlowControl> getFlowMap();

public:
    explicit SerialPortWrap(QObject *parent = nullptr);

    void setSerialPort(QSerialPort *port);

    bool sendNoReply(QByteArray data);

    bool sendReply(QByteArray data, QByteArray &rec);

signals:
    void receivedData(QByteArray data);

public slots:

private:
    QSerialPort *_serial=nullptr;
    QList<QByteArray> _recList;

    void waitMs(int ms);

private slots:
    void onError(QSerialPort::SerialPortError err);
    void onReadyReady();
};

#endif // SERIALPORTWRAP_H

cpp

#include <QMap>
#include <QDebug>
#include <QEventLoop>
#include <QElapsedTimer>
#include <QTimer>
#include "serialportwrap.h"

QMap<QString, QSerialPort::Parity> SerialPortWrap::getParityMap()
{
    QMap<QString,QSerialPort::Parity> parityMap={
        {"NoPraity",QSerialPort::NoParity},
        {"EvenParity",QSerialPort::EvenParity},
        {"OddParity",QSerialPort::OddParity},
        {"SpaceParity",QSerialPort::SpaceParity},
        {"MarkParity",QSerialPort::MarkParity}
    };
    return parityMap;
}

QMap<QString, QSerialPort::DataBits> SerialPortWrap::getDataMap()
{
    QMap<QString,QSerialPort::DataBits> dataMap={
        {"Data5",QSerialPort::Data5},
        {"Data6",QSerialPort::Data6},
        {"Data7",QSerialPort::Data7},
        {"Data8",QSerialPort::Data8}
    };
    return dataMap;
}

QMap<QString, QSerialPort::StopBits> SerialPortWrap::getStopMap()
{
    QMap<QString,QSerialPort::StopBits> stopMap={
        {"OneStop",QSerialPort::OneStop},
        {"OneAndHalfStop",QSerialPort::OneAndHalfStop},
        {"TwoStop",QSerialPort::TwoStop}
    };
    return stopMap;
}

QMap<QString, QSerialPort::FlowControl> SerialPortWrap::getFlowMap()
{
    QMap<QString,QSerialPort::FlowControl> flowMap={
        {"NoFlowControl",QSerialPort::NoFlowControl},
        {"HardwareControl",QSerialPort::HardwareControl},
        {"SoftwareControl",QSerialPort::SoftwareControl},
        {"UnknownFlowControl",QSerialPort::UnknownFlowControl}
    };
    return flowMap;
}

SerialPortWrap::SerialPortWrap(QObject *parent) : QObject(parent)
{

}

void SerialPortWrap::setSerialPort(QSerialPort *port)
{
    _serial=port;
    connect(_serial,&QSerialPort::errorOccurred,this,&SerialPortWrap::onError);
    connect(_serial,&QSerialPort::readyRead,this,&SerialPortWrap::onReadyReady);
}

bool SerialPortWrap::sendNoReply(QByteArray data)
{
    _recList.clear();
    return  _serial->write(data)!=-1;
}

bool SerialPortWrap::sendReply(QByteArray data,QByteArray &rec)
{
    _recList.clear();
    _serial->write(data);

    QElapsedTimer ela;
    ela.start();
    while(_recList.count()==0)
    {
        waitMs(100);
        if(ela.elapsed()>3000)
        {
            throw QString("%1 time out").arg(_serial->portName());
        }
    }
    waitMs(50);
    QByteArray arr;
    for(int i=0;i<_recList.count();i++)
    {
        arr.append(_recList.at(i));
    }
    rec=arr;
    return true;
}

void SerialPortWrap::waitMs(int ms)
{
    QEventLoop loop;
    QTimer::singleShot(ms, &loop, &QEventLoop::quit);  // 设置定时器,在超时时退出事件循环
    loop.exec();  // 进入事件循环
}

void SerialPortWrap::onError(QSerialPort::SerialPortError err)
{
    qDebug()<<__FUNCTION__<<__LINE__<<_serial->portName()<<_serial->errorString();
}

void SerialPortWrap::onReadyReady()
{
    QByteArray arr=_serial->readAll();
    _recList.append(arr);
    emit receivedData(arr);
}


4.效果图:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值