Member 9350237 Ответов: 1

Как использовать qserialport в мульти виджетном приложении


Всем привет,

Я разрабатываю настольное приложение Qt с несколькими виджетами, которое последовательно взаимодействует со встроенным устройством. Я новичок в разработке приложений Qt и последовательных портов.


Мне нужно повторно использовать открытый экземпляр последовательного порта и в других формах для чтения или записи.

Где и как я могу настроить последовательный порт, чтобы получить к нему доступ в нескольких формах без повторения конфигурации?

например, если у меня есть подключение во втором виджете, как я могу получить доступ к последовательному объекту??

Любая помощь будет только приветствоваться.

Что я уже пробовал:

Я создал экземпляр в одном модуле (файл.cpp), а затем экспортировал объявление через файл .h, который другие модули, которым нужен доступ к нему.

Вот последовательного осуществления

#ifndef TETRASERIAL_H
#define TETRASERIAL_H

#include <QObject>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QDebug>

class tetraSerial : public QObject
{
    Q_OBJECT
public:
    explicit tetraSerial(QObject *parent = nullptr);
  static QSerialPort *serialObject;

signals:

public slots:
};

#endif // TETRASERIAL_H


Соответствие .СРР файл выглядит следующим образом.

Я настроил последовательный порт в этом файле класса. Я хочу вызвать этот экземпляр в разных окнах.

#include "tetraserial.h"

 QSerialPort *tetraSerial::serialObject;


tetraSerial::tetraSerial(QObject *parent) : QObject(parent)
{

   serialObject = new QSerialPort(this);
   serialObject->setPortName("com5");
   serialObject->setBaudRate(1000000);
   serialObject->setDataBits(QSerialPort::Data8);
   serialObject->setParity(QSerialPort::NoParity);
   serialObject->setStopBits(QSerialPort::OneStop);
   serialObject->setFlowControl(QSerialPort::HardwareControl);
   serialObject->open(QIODevice::ReadWrite);

}


Я попытался вызвать это с помощью " connect` в главном окне следующим образом.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtSerialPort/QSerialPort>
#include "tetraserial.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

  connect(tetraSerial::serialObject, SIGNAL(readyRead()),this,SLOT(serialRecived()));

}



Я получаю ошибку времени выполнения и бросаю это в консоль.

не удается подключиться <null>::readData() Mainwindow::serialRecived

1 Ответов

Рейтинг:
1

Gerry Schmitz

Последовательный порт может быть доступен только одному потоку одновременно (открыть; закрыть).

Каждое окно имеет свой собственный поток, поэтому они не могут "совместно использовать порт".

Вы можете совместно использовать "данные" / параллельные очереди, а не Порт.