Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Переподключение к COM порту при его отключении



  • Добрый день, подскажите как реализовать, чтоб при отключении COM порта, программа снова пыталась подключиться к нему либо к любому другому порту из списка ?
    main.qml

           SerialPort
           {
               id: cppClass  
           }
    

    Serialport.cpp

    #include "serialport.h"
    #include <QDebug>
    SerialPort::SerialPort(QObject *parent):QObject(parent)
    {
        arduino = new QSerialPort(this);
        connect(arduino, &QSerialPort::readyRead, this, &SerialPort::onReadData);
        openDefault();
    
    }
    SerialPort::~SerialPort()
    {
        delete arduino;
    }
    void SerialPort::set_serial_data(QString newValue)
    {
        if (mserial_data == newValue)
            return;
        mserial_data = newValue;
        emit serial_data_Changed(mserial_data);
    }
    void SerialPort::onReadData()
    {
        QByteArray dataRecv = arduino->readAll ();
         int sepPos = dataRecv.indexOf (':');
         int dataBufSz = dataBuffer.size ();
         dataBuffer.append (dataRecv);
         if (sepPos!=-1) {
           int recStart = 0;
           sepPos += dataBufSz;
           do {
             processSingleRecord (dataBuffer.mid (recStart, sepPos - recStart));
             recStart = sepPos + 1;
             sepPos = dataBuffer.indexOf (':', recStart);
           } while (sepPos!=-1);
           dataBuffer = dataBuffer.mid (recStart);
       //qDebug()<< recStart ;
        }
    }
    void SerialPort::processSingleRecord (QByteArray value) {
      // ... разбор полученной записи и связанные действия
              qDebug()<<qqq;
    } 
    void SerialPort::openDefault()
    { 
    //ttyS1
      //ttyS0
    //ttyS4
        //COM5
        //ttyACM0
        arduino->setPortName("COM12");
        arduino->setBaudRate(QSerialPort::Baud115200);
        arduino->setDataBits(QSerialPort::Data8);
        arduino->setParity(QSerialPort::NoParity);
        arduino->setStopBits(QSerialPort::OneStop);
        arduino->setFlowControl(QSerialPort::NoFlowControl);
    
        if(arduino->open(QSerialPort::ReadWrite))
            qDebug()<<"Connected to "<< "ttyACM0";
        else
         qCritical()<<"Serial Port error: " << arduino->errorString();  
    }
    QString SerialPort::get_serial_data() const
    {
        return mserial_data;
    }
    
    


  • Решил проблему следующим способом
    добавил слоты в serialport.h

    
    public slots:
        void onReadData();
      void handleError(QSerialPort::SerialPortError error);
        void  DisconnectPort();
    

    в serialport.cpp добавил

    connect(arduino, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(handleError(QSerialPort::SerialPortError)));
    
    void SerialPort::handleError(QSerialPort::SerialPortError error)
    {
        if ( (arduino->isOpen()) && (error == QSerialPort::ResourceError)) {
            DisconnectPort();
        }
    }
    
    void  SerialPort::DisconnectPort(){
        if(arduino->isOpen()){
            arduino->close();
            while (!arduino->isOpen())
            {
                 openDefault();
            }
        }
    }
    

Log in to reply