说明:最近利用QT在开发上位机软件,遇到了一个难题:随机分配的端口要与连接的设备对应上。在网上查了一下,思路是通过发送指令,根据不同的指令,会有不同的回复信息。可参考链接https://bbs.youkuaiyun.com/topics/392075688?page=1
现贴上自己的实现逻辑,以作备忘,在此得感谢公司同事海哥的帮助!
//头文件
#ifndef UPPERCOMPUTER_HPP
#define UPPERCOMPUTER_HPP
#include <QObject>
class upperComputer : public QObject
{
Q_OBJECT
public:
upperComputer( QObject *parent = nullptr );
~upperComputer();
//发送命令
void sendCmd();
//接收设备返回的消息
void readBytes();
private:
//串口变量
QList <QSerialPort*> comList;
//列表里按sendCmd函数的顺序保存与设备连接对应的端口
QStringList list4Port;
#endif // UPPERCOMPUTER_HPP
//源文件
#include "upperComputer.hpp"
upperComputer::upperComputer(QObject *parent):QObject(parent)
{
//遍历所有可用的端口,并new与之对应的QSerialPort变量,设置串口参数,添加信号关联
foreach( const QSerialPortInfo &info,QSerialPortInfo::availablePorts() ){
QSerialPort *port = new QSerialPort(info);
comList.append(port);
port->setObjectName(info.portName());
port->setBaudRate(QSerialPort::Baud9600);
port->setDataBits(QSerialPort::Data8);
port->setParity(QSerialPort::NoParity);
port->setStopBits(QSerialPort::OneStop);
port->setFlowControl(QSerialPort::NoFlowControl);
port->open(QIODevice::ReadWrite);
connect(port, &QSerialPort::readyRead, this, &upperComputer::readBytes);
}
}
upperComputer::~upperComputer()
{
}
//可用connect(&pushbutton,点击信号,this,sendCmd)
void upperComputer::sendCmd()
{
//有多少个设备,就发多少条命令,注意时间间隔
//"命令"是与设备通信的二进制流
for (auto var:comList){
var->write("命令");
}
QTimer::singleShot(1000,[&](){
for( auto var : comList ){
var->write("命令");
}
});
QTimer::singleShot(2000,[&](){
for( auto var : comList ){
var->write("命令");
}
});
QTimer::singleShot(4000,[&](){
for( auto var : comList ){
var->write("命令");
}
});
}
void upperComputer::readBytes()
{
//sender()可查看QT帮助文档,这里是获取到发送信号的对象指针
QObject *obj = sender();
QSerialPort *port = reinterpret_cast<QSerialPort*>(obj);
port->waitForReadyRead(1000);
QByteArray data = port->readAll();
if (!data.isEmpty()){
//将端口添加进列表中,我们按照顺序,给设备分配好端口,这样就能获取到端口与之相连的设备,做到相对随机
list4Port.append(port->portName())
}
}