Передача сигнала через интерфейс

Рейтинг: 0Ответов: 1Опубликовано: 21.08.2023

Есть класс Device в котором необходимо отправить данные устройству через Serial Port и дождаться ответа устройства.

При превышении таймаута выходим из ожидания и отправляем соответствующее сообщение, если ответ пришел так же выходим и переходим в обработчик данных. Для этого реализовал нижеуказанный метод класса.

Проблема в том что QSerialPort подключается к классу Device через интерфейс и я не могу понять существует ли возможность пробросить сигнал readyRead от реализации интерфейса к классу Device?

Фактически у класса последовательного порта сигнал readyRead есть, но как его доставить не могу найти информацию

void Device::idleAnswer(){
    QTimer answerTimer;
    answerTimer.setSingleShot(true);
    QEventLoop loop;
    /*******( &_interface,&_interface::readyRead, &loop,    &QEventLoop::quit );  <- в идеале что то такое */
    connect( &answerTimer, &QTimer::timeout, &loop, &QEventLoop::quit );  //выход из ожидания если превышен таймаут
    answerTimer.start(200);
    loop.exec();

    if(answerTimer.isActive())
        //обработчик данных
    else
       //обработчик превышения таймаута
}

Интерфейс:

class I_phisicalConnect : public QObject { 
public:     
    virtual void sendData(QString data) = 0;       
    virtual int connect(QString _portName) = 0;     
    virtual int disconnect(QString _portName) = 0;     
    virtual QString getData(uint adress) = 0;     
    virtual QList <QString> getPorts() = 0;     
    virtual bool portAvailable() = 0; 
};

Вот схема архитектурывведите сюда описание изображения

То есть мне нужно понять как пробросить сигнал от QSerialPort сквозь I_phisicalConnect до Device

Ответы

▲ 2

Не надо делать connect в созданном классе. Это можно сделать только дикими костылями.

В общем и целом идея таких соединений: введите сюда описание изображения В вашем интерфейсе:

// где-то (возможно в конструкторе) вы создаете ваш класс девайс
Device* deviceInstance = new Device();
connect(deviceInstance,SIGNAL(signalReadyRead()),this,SLOT(slotReadyRead())); // в interface.h должен быть объявлен сигнал signalReadyRead

и собственно прокинуть сигнал порта на сигнал самого себя в Device:

connect(port,SIGNAL(readyRead()),this,SIGNAL(signalReadyRead())); // в Device.h должен быть объявлен сигнал signalReadyRead
connect(port,SIGNAL(readyRead()),this,SLOT(slotReadyRead())); // здесь мы сами обработаем данные

В итоге: при появлении сигнала readyRead вашего порта, произойдет сигнал readyRead уже от вашего объекта, а в свою очередь к сигналу объекта уже подсоединен слот интерфейса slotReadyRead