需求
两串口设置统一,均如下图:
项目实战(命令行版)
项目的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