Qt5使用connect連接信號和槽,編譯構建無錯,實際運行不會調用槽函數!!!!


如題:使用串口發送文件,使用GUI配置文件寫入下位機信息,組幀下發給下位機解析,解析成功后,下位機會在程序進入接受數據循環前發送響應給上位機,上位機接受響應下發文件,在mainwindow.h中自定義信號getinfo()和槽函數downloadfile()

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QList>
#include <QFileDialog>
#include <QPushButton>
#include <QLineEdit>
#include <QDebug>
#include <QProgressBar>
#include <QDir>
#include <QFileInfo>
#include <QFile>
#include <QComboBox>
#include <QByteArray>
#include <QMessageBox>
#include <QDebug>
#include <QTime>
#include <QTimer>
#include <QTextCodec>
#include <QThread>
#include <QTextDocument>

quint32 swapInt32(quint32 value);
quint32 QStringTo4ByteHex(QString source);
unsigned char * SerportMsg(quint32 Addr,quint32 FileSize);

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QString filename;
    QTimer timer;
    void QDelay(quint32 msec);

private slots:
    void on_btn_openConsole_clicked();

    void on_btn_clearRecv_clicked();

    void on_btn_clearSend_clicked();

    void readData();

    void on_fileBtn_clicked();

    void on_sendfileBtn_clicked();

private:
    Ui::MainWindow *ui;
    QSerialPort *serial;
    QString buf;

signals:
    void getinfo();//自定義信號

public slots:
    void downloadFile();
};

#endif // MAINWINDOW_H

MainWindow.cpp中讀取下位機發送的數據,分析響應,若是握手信號,接受框顯示信息,若為文件數據幀響應則將發送getinfo()信號

void  MainWindow::readData()
{
    //QString buf;
    buf = serial->read(1);
    ui->textEdit_recv->append(buf);
    //響應數據對比處理
    if(buf == "s")  //顯示串口打開成功
    {
        ui->textEdit_recv->append("connect uart success!");
        buf.clear();
    }

    //文件發送
    if(buf == "S")
    {
        ui->textEdit_recv->append("ready to send signal!");
        emit getinfo();
    }
}
void MainWindow::on_sendfileBtn_clicked()
{
    QString filename = ui->File_LineEdit->text();
    QFile file(filename);
    quint32 FileSize = file.size();

    qDebug("FileSize is 0x%x",FileSize);

    //發數據命令:Addr+file_size
    QString addr = ui->AddrLineEdit->text();
    if(addr.length() > 8)
    {
        QMessageBox::critical(this,"critical","address range override,please rewrite!!!",
                              QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes);
        return;
    }

    QByteArray tmp = addr.toLatin1();
    const char * lpo = tmp.data();
    quint32 ADDR;
    sscanf(lpo,"%x",&ADDR);
    qDebug("addr is %s",addr);
    qDebug("ADDR is 0x%x",ADDR);

    if(filename.isEmpty()|addr.isEmpty())
    {
        QMessageBox::critical(this,"critical",
                              "please select bin file and configure the address",
                              QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes);
    }

    //定義下發文件數據幀
    unsigned char *frame = SerportMsg(ADDR,FileSize);
    QByteArray bootInfo((char*)frame,12);
    serial->write(bootInfo);
    delete [] frame;
    connect(ui->sendfileBtn,SIGNAL(getinfo),this,SLOT(MainWindow::downloadFile()));
}

構建無錯誤,運行后出現下發數據幀,但不會執行槽函數downloadFile()!!!                                         --- 2019/10/24

              


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM