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
- Qt 转发两串口数据(一、命令行版)
- Qt 转发两串口数据(二、桌面程序版)
- QT串口编程(一)
- QT串口读取数据
- Qt---串口操作之串口数据合并(有待改进)
- 转发QT(1)
- (一)Qt:键盘输入,两行editline
- Qt编写串口通信程序全程图文讲解(一)
- <linux+qt>使用thread监控串口通信(一)
- QT 串口 (windows)
- QT 串口 (windows)
- QT 串口 (windows)
- Qt从零开始制作串口调试助手-(第十二章、串口数据发送)-Creator_Ly
- 协议rs485协议,串口通讯(转发)
- J1850总线协议数据转串口协议数据(一)
- udp_server_c#_与串口间的数据转发
- cc2531USB dongle 实现MT模式 数据转发 串口
- linux下多线程多串口数据转发程序
- 微信小程序开发之『侧边栏滑动』特效
- Oracle查看表或者视图的定义语句
- AndroidImageSlider三分钟快速集成酷炫自动轮播广告
- android大分辨率问题
- 微信小程序开发之『侧边栏滑动』特效
- Qt 转发两串口数据(一、命令行版)
- Spring 学习(一)
- Unity快速创建项目常用的文件夹
- 一趟快排
- IM基础:XMPP协议相关
- 【NOIP2017模拟12.3】子串
- tomcat servlet初步了解
- Java事件类型
- Android打包的那些事