Qt 转发两串口数据(一、命令行版)

需求

这里写图片描述

两串口设置统一,均如下图:

这里写图片描述

项目实战(命令行版)

项目的pro文件

在项目的pro文件中添加

QT += serialport

forwardobj.h

#ifndef FORWARDOBJ_H
#define FORWARDOBJ_H

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


/** 波特率:位/秒(B) */
const QSerialPort::BaudRate BAUND_RATE = QSerialPort::Baud115200;
/** 数据位(D) */
const QSerialPort::DataBits DATA_BITS = QSerialPort::Data8;
/** 奇偶校验(P) */
const QSerialPort::Parity PARITY = QSerialPort::NoParity;
/** 停止位(S) */
const QSerialPort::StopBits STOP_BITS = QSerialPort::OneStop;
/** 流控制(F) */
const QSerialPort::FlowControl FLOW_CONTROL = QSerialPort::NoFlowControl;

class ForwardObj : public QObject
{
    Q_OBJECT
public:
    explicit ForwardObj(QObject *parent = 0);
    ~ForwardObj();
    /** @brief 获取可用端口数目 */
    static int getAvaliablePortsCount();
    /** @brief 打印可用端口 */
    static void printAvailablePorts();
    /** @brief 打开串口并设置相应的参数 */
    bool openPort(const QString &portName1, const QString &portName2);
    /** @brief  连接两串口,用于转发 */
    void connectDoublePort();
    /** @brief 关闭串口 */
    void close();
public slots:
    void port1ReadyRead();
    void port2ReadyRead();
private:
    QSerialPort serialPort1;
    QSerialPort serialPort2;
    /** @brief 打开串口并设置相应的参数 */
    bool openPort(QSerialPort &serialPort, const QString &portName);
    /** @brief 转发收到的数据 */
    void forward(QSerialPort &fromPort, QSerialPort &toPort);
};

#endif // FORWARDOBJ_H

forwardobj.cpp

#include "forwardobj.h"

ForwardObj::ForwardObj(QObject *parent) : QObject(parent) {
}

ForwardObj::~ForwardObj() {
    close();
}

int ForwardObj::getAvaliablePortsCount()
{
    int count = 0;
    QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
    if(!ports.isEmpty()) {
        count = ports.count();
    }
    return count;
}

void ForwardObj::printAvailablePorts()
{
    QTextStream qout(stdout);
    QList<QSerialPortInfo> portInfoList = QSerialPortInfo::availablePorts();
    if(portInfoList.isEmpty()) {
        qout<<"Not found any avaliable serial ports"<<endl;
        return;
    }
    qout<<"Found "<<portInfoList.size()<<" avaliable serial ports"<<endl<<endl;
    foreach(QSerialPortInfo info, portInfoList) {
        qout<<"Name        : "<<info.portName()<<endl;
        qout<<"Description : "<<info.description()<<endl;
        qout<<"Manufacturer: "<<info.manufacturer()<<endl;
        //qout<<"serialNumber: "<<info.serialNumber()<<endl;
        qout<<endl;
    }
}

bool ForwardObj::openPort(const QString &portName1, const QString &portName2)
{
    bool ret;
    ret = openPort(serialPort1, portName1);
    if(ret) {
        ret = openPort(serialPort2, portName2);
    }
    if(!ret) {
        close();
    }
    return ret;
}

void ForwardObj::connectDoublePort()
{
    connect(&serialPort1, SIGNAL(readyRead()), this, SLOT(port1ReadyRead()));
    connect(&serialPort2, SIGNAL(readyRead()), this, SLOT(port2ReadyRead()));
}

void ForwardObj::close()
{
    QTextStream qout(stdout);
    if(serialPort1.isOpen()) {
        QString str(serialPort1.portName());
        str.append(" has closed");
        serialPort1.close();
        qout<<str<<endl;
    }
    if(serialPort2.isOpen()) {
        QString str(serialPort1.portName());
        str.append(" has closed");
        serialPort2.close();
        qout<<str<<endl;
    }
}

void ForwardObj::port1ReadyRead()
{
    forward(serialPort1, serialPort2);
}

void ForwardObj::port2ReadyRead()
{
    forward(serialPort2, serialPort1);
}

bool ForwardObj::openPort(QSerialPort &serialPort, const QString &portName)
{
    QTextStream qout(stdout);
    foreach (const QSerialPortInfo info, QSerialPortInfo::availablePorts()) {
        if(QString::compare(info.portName(), portName, Qt::CaseInsensitive) == 0) {
            serialPort.setPort(info);
            //打开串口后才能进行余下设置
            bool ret = serialPort.open(QIODevice::ReadWrite);
            if(ret) {
                serialPort.setBaudRate(BAUND_RATE);
                serialPort.setDataBits(DATA_BITS);
                serialPort.setParity(PARITY);
                serialPort.setStopBits(STOP_BITS);
                serialPort.setFlowControl(FLOW_CONTROL);
                serialPort.clearError();
                //The serial port has to be open before trying to clear any buffered data; otherwise returns false and sets the NotOpenError error code.
                serialPort.clear();
            }
            qout<<"Open serial port "<<info.portName()<<(ret?" succ":" fail")<<endl;
            return ret;
        }
    }
    qout<<"serial port \""<<portName<<"\" not found "<<endl;
    return false;
}

void ForwardObj::forward(QSerialPort &fromPort, QSerialPort &toPort)
{
    QTextStream qout(stdout);
    QByteArray buffer = fromPort.readAll();
    qout<<"Read from "<<fromPort.portName()<<", data :"<<endl;
    qout<<"\t"<<buffer.toHex()<<endl;
    qint64 len = toPort.write(buffer);
    if(len == -1) {
        qout<<"Forward to "<<toPort.portName()<<" fail, error occur:"<<endl;
        qout<<"\t"<<toPort.errorString()<<endl;
    } else {
        qout<<"Forward to "<<toPort.portName()<<" succ"<<endl;
    }
}

main.cpp

#include <QCoreApplication>
#include "forwardobj.h"

using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTextStream qin(stdin);
    QTextStream qout(stdout);
    ForwardObj forwardObj;

    if(ForwardObj::getAvaliablePortsCount() < 2) {
        qout<<"The count of serial ports cannot be smaller than two"<<endl;
        return a.exec();
    }

    ForwardObj::printAvailablePorts();

    QString portName1, portName2;
    qout<<"Please input 2 port to forward data such as COM1 COM2(use space to split ports):"<<endl;
    qin>>portName1>>portName2;

    bool ret;
    ret = forwardObj.openPort(portName1, portName2);
    if(!ret) {
        forwardObj.close();
        qout<<"Open fail, program close"<<endl;
        return a.exec();
    }

    forwardObj.connectDoublePort();

    return a.exec();
}

最后生成的可执行文件需要引用的DLL

  • libgcc_s_dw2-1.dll
  • libstdc++-6.dll
  • libwinpthread-1.dll
  • Qt5Core.dll
  • Qt5SerialPort.dll
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值