qserialport падает при вызове из слота - PullRequest
0 голосов
/ 24 мая 2019

Я пишу графический интерфейс в QT для управления USB-реле. Я написал класс реле, который включает / выключает функции-члены. также написал собственный виджет, который имеет переключатели для управления, указатель реле, а также слот switchStatus (), в котором вызывались функции включения / выключения реле. Главное окно имеет членов реле. Когда я вызываю ui-> widget-> switchStatus () из конструктора mainwindow, все работает нормально, реле можно хорошо включать и выключать. Однако, если я подключаю сигнал переключателя к switchStatus (), программа вылетает всякий раз, когда я нажимаю переключатель. Вылетает в строке serialPort-> write. Но дело не в записи, любой код, связанный с указателем serialPort, к которому он первым пришел, вызовет сбой. даже я хочу получить имя порта или адрес порта.

myWidget::myWidget(QWidget *parent) : QWidget(parent), m_ui(new Ui::Form)
{    status = 0;

    m_ui->setupUi(this);
    m_ui->statusIndicator->status = &status; // status in ui pointing to null before this

    m_ui->turnOffButton->setChecked(true);
    connect(m_ui->turnOnButton, SIGNAL(clicked(bool)), this, SLOT(switchStatus())); 
//crashes when click ratioButton, 
//compare to last line in the mainwindow construtor
    connect(m_ui->turnOffButton, SIGNAL(clicked(bool)), this, SLOT(switchStatus()));
}

void myWidget::switchStatus()
{
    qDebug() << "swithcing";
    if(status)
    {
        setStatus(false);
    }
    else
    {
        setStatus(true);
    }
    m_relay->switchStatus();

}


void relay::switchStatus()
{   if(status) turnOff();
    else turnOn();
}

bool relay::turnOn(){
    qDebug() << writeDataOn; // test if string is correct
    qDebug() << serialPort; // crashes whenever serialPort address is called
    const qint64 bytesWritten = serialPort->write(writeDataOn);
}


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    QList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();
    qDebug() << infos[0].description();
    QSerialPort serialPort;
    serialPort.setPortName(infos[0].portName());
    serialPort.setBaudRate(QSerialPort::Baud9600);
    if (!serialPort.open(QIODevice::ReadWrite)) {
        qDebug() << QObject::tr("Failed to open port %1, error: %2").arg(serialPort.portName()).arg(serialPort.error()) ;
    }
    ui->setupUi(this);
    for(int i=0;i<4;i++)
    {
        relays[i].setRelayNumber(i);
        relays[i].setPort(&serialPort);
        relays[i].setStatus(relays[i].getRealStatus());
    }


    ui->widget->m_relay = relays;

    qDebug() << ui->widget->m_relay;
    qDebug() << ui->widget->m_relay->getPort();

    ui->widget->switchStatus(); // this line runs well
}

1 Ответ

0 голосов
/ 24 мая 2019

Сделайте ваш последовательный порт членом класса MainWindow.В данный момент он является локальным для вашего конструктора, поэтому он освобождается по завершении конструктора, что приводит к его аварийному завершению.Если вы объявили член «serialPort», вы скрываете его, повторно обозначая его как локальную переменную области видимости внутри конструктора.

...