QT实现上位机---随机分配的端口对应上与其相连的设备

说明:最近利用QT在开发上位机软件,遇到了一个难题:随机分配的端口要与连接的设备对应上。在网上查了一下,思路是通过发送指令,根据不同的指令,会有不同的回复信息。可参考链接https://bbs.csdn.net/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())

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在同一界面下放上所有的按钮去控制,按钮间的逻辑关系有点复杂。即使做出来用户用着也会感觉有些别扭,据此我们干脆分成几个界面来做。(总控与退出按钮不要也行) 第一界面:楼体、环境、退出; 第二界面:楼体1、楼体2、返回、退出; 第三界面:户型A01---A04、B01---B04、返回、退出; 第四界面:户型2-01---2-04、返回、退出。 按钮1>>楼体, 按钮2>>环境; 按钮3>>楼体1, 按钮4>>楼体2, 按钮5>>返回; 按钮6---按钮13>>[A01---A04][B01---B04], 按钮14>>返回; 按钮15---按钮18>>[2-01---2-04],按钮19>>返回; (0-F路为16继电器输出) 程序动作如下: 第一界面: 1. 按钮1开-开[0]路>>弹出第二界面;按钮1关-关[0]。 2. 按钮2开-开[1]路,按钮2关-关[1]路。 第二界面: 1. 点击按钮3-开[2]路,>>弹出第三界面。 2. 点击按钮4-开[3]路,>>弹出第四界面。 3. 点击按钮5>>返回第一界面。 第三界面: 1. 按钮6开-开[4]路,按钮6关-关[4]路。 2. 按钮7开-开[5]路,按钮7关-关[5]路。 3. 按钮8开-开[6]路,按钮8关-关[6]路。 4. 按钮9开-开[7]路,按钮9关-关[7]路。 5. 按钮10开-开[8]路,按钮10关-关[8]路。 6. 按钮11开-开[9]路,按钮11关-关[9]路。 7. 按钮12开-开[A]路,按钮12关-关[A]路。 8. 按钮13开-开[B]路,按钮13关-关[B]路。 9. 点击按钮14-关[2][4-B]路>>返回第二界面。 第四界面: 1. 按钮15开-开[C]路,按钮15关-关[C]路。 2. 按钮16开-开[D]路,按钮16关-关[D]路。 3. 按钮17开-开[E]路,按钮17关-关[E]路。 4. 按钮18开-开[F]路,按钮18关-关[F]路。 9. 点击按钮19-关[3][C-F]路>>返回第二界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值