window下封装的qt串口类

如果编写的软件一次只需要使用一个串口,使用单例模式,如果同时需要使用多个串口,则需要取消单例模式。
h文件

#ifndef SERIAL_H
#define SERIAL_H

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

class Serial : public QObject
{
    Q_OBJECT
public:
    static Serial *instance();

    static QStringList findPort();

    bool open(QString port, quint64 baud = 9600);
    void close(){   serial->close();    }
    bool isOpen(){  return serial->isOpen();    }

    qint64 sendData(QByteArray data);
    qint64 sendData(QString data);

signals:
    void haveReceive(QByteArray data);
    void sendDataShow(QString data,bool isOk);
private:
    static Serial* mPtr;
    explicit Serial(QObject *parent = nullptr);
    QSerialPort *serial;

};


#endif // SERIAL_H

cpp文件

#include "serial.h"
#include<QDataStream>

Serial* Serial::mPtr = nullptr;

Serial *Serial::instance()
{
    if(nullptr == mPtr)
        mPtr = new Serial();
    return mPtr;
}

Serial::Serial(QObject *parent) : QObject(parent)
{
    serial = new QSerialPort;
    connect(serial, &QSerialPort::readyRead, this, [=]()
    {
        QByteArray data = serial->readAll();
        emit haveReceive(data);
    });
}

QStringList Serial::findPort()
{
    QStringList portBuff;
    foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
            portBuff.append(serial.portName());
            serial.close();
        }
    }
    return portBuff;
}

bool Serial::open(QString port,quint64 baud)
{
    if(serial->isOpen())    serial->close();
    serial->setPortName(port);
    if(!serial->open(QIODevice::ReadWrite))
        return false;
    switch (baud)
    {
        case 1200: serial->setBaudRate(QSerialPort::Baud1200);   break;
        case 4800: serial->setBaudRate(QSerialPort::Baud4800);   break;
        case 9600: serial->setBaudRate(QSerialPort::Baud9600);   break;
        case 19200: serial->setBaudRate(QSerialPort::Baud19200);  break;
        case 38400: serial->setBaudRate(QSerialPort::Baud38400);  break;
        case 57600: serial->setBaudRate(QSerialPort::Baud57600);  break;
        case 115200: serial->setBaudRate(QSerialPort::Baud115200); break;
    }
    switch (8){
        case 5:     serial->setDataBits(QSerialPort::Data5);     break;
        case 6:     serial->setDataBits(QSerialPort::Data6);     break;
        case 7:     serial->setDataBits(QSerialPort::Data7);     break;
        case 8:     serial->setDataBits(QSerialPort::Data8);     break;
        default:     break;
    }
    switch (0){
        case 0:     serial->setParity(QSerialPort::NoParity);   break;
        default:    break;
    }
    switch (1){
        case 1: serial->setStopBits(QSerialPort::OneStop);  break;
        case 2: serial->setStopBits(QSerialPort::TwoStop);  break;
        default:     break;
    }
    serial->setFlowControl(QSerialPort::NoFlowControl);
    return true;
}

qint64 Serial::sendData(QByteArray data)
{
    bool isOk = 0;
    if(serial->write(data) > 0)
        isOk = 1;
    QString dataStr = "Tx(hex):" + Common::HexToHexstr(data);
    emit sendDataShow(dataStr,isOk);
    return isOk;
}

qint64 Serial::sendData(QString data)
{
    bool isOk = 0;
    if(serial->write(data.toLatin1()) > 0)
        isOk = 1;
    data.insert(0,"Tx:");
    emit sendDataShow(data,isOk);
    return isOk;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值