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

来源:互联网 发布:淘宝商城牛仔男装裤子 编辑:程序博客网 时间:2024/05/22 04:34

需求

这里写图片描述

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

这里写图片描述

项目实战(命令行版)

项目的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_OBJECTpublic:    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
0 0
原创粉丝点击