如題:使用串口發送文件,使用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
