QT實現串口調試

最近由於測試藍牙串口模塊比較多,爲了提高效率,順便接觸一下串口調試工具開發。用QT寫了一個小測試程序。

用到三個源文件:main.cpp,mainwindow.h,mainwindow.cpp。先貼代碼。

main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
 
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QTimer>


#define CMD_NULL        0x00000000
#define CMD_SET_NAME    0x00000001
#define CMD_SET_PIN     0x00000002
#define CMD_SET_BAUD    0x00000004
#define CMD_SET_SERVER  0x00000008
#define CMD_GET_VER     0x00000010

namespace Ui {
class MainWindow;
}

typedef struct{
    int comName;
    int baudRate;
    int checkSum;
    int dataBits;
    int stopBits;
    int btNumber;
}SystemSet;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:

    void on_pushButton_7_clicked();

    void on_pushButton_8_clicked();

    void on_pushButton_clicked();

    void ReadCom();

    void on_pushButton_2_clicked();

    void ProcTimeOut();

    void on_pushButton_4_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_5_clicked();

    void on_pushButton_6_clicked();

private:
    Ui::MainWindow *ui;
    SystemSet systemSet;
    QSerialPort myserial;
    QTimer appTimer;
    int cmdFlag;
    int waitTime;
    int isSetNum;
    QByteArray serialData;
//    QSerialPortInfo serialInfo;

    void SetSystemParam();
    void SaveSystemSet();
    void SetSerialPortInfo();
    void SetSerialBaudRate();
    void ProcReceiveData();
};

#endif // MAINWINDOW_H

 

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QMessageBox>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    cmdFlag = CMD_NULL;
    serialData.clear();
    waitTime = 0;
    isSetNum = 0;
    setWindowTitle("藍牙模塊設置程序");
    SetSystemParam();
    SetSerialPortInfo();
    appTimer.setSingleShot(false);
    connect(&appTimer,SIGNAL(timeout()),this,SLOT(ProcTimeOut()));
    appTimer.start(1000);
}

MainWindow::~MainWindow()
{
    if(myserial.isOpen())
    {
        myserial.clear();
        myserial.close();
    }
    delete ui;
}

void MainWindow::ProcTimeOut()
{
//    qDebug("-----ProcTimeOut----cmdFlag:%d,waitTime:%d",cmdFlag,waitTime);
    if(waitTime > 0)
    {
        if(--waitTime <= 0)
        {
            QString title;
            if(cmdFlag & CMD_SET_NAME)
            {
                title += tr("設置藍牙名稱失敗 ");
                cmdFlag &= (~CMD_SET_NAME);
            }
            if(cmdFlag & CMD_SET_PIN)
            {
                title += tr("設置藍牙配對碼失敗 ");
                cmdFlag &= (~CMD_SET_PIN);
            }
            if(cmdFlag & CMD_SET_BAUD)
            {
                title += tr("設置藍牙波特率失敗 ");
                cmdFlag &= (~CMD_SET_BAUD);
            }
            if(cmdFlag & CMD_SET_SERVER)
            {
                title += tr("設置藍牙從設備失敗 ");
                cmdFlag &= (~CMD_SET_SERVER);
            }
            if(cmdFlag & CMD_GET_VER)
            {
                title += (tr("獲取版本號失敗"));
                cmdFlag &= (~CMD_GET_VER);
            }
            if(!title.isEmpty())
            {
                ui->label_9->setText(title);
            }
            else
            {
                ui->label_9->setText(tr("發送指令結果"));
            }
        }
    }
}

void MainWindow::on_pushButton_7_clicked()
{
    ui->textEdit->clear();
}

void MainWindow::on_pushButton_8_clicked()
{
    ui->textEdit_2->clear();
}

void MainWindow::on_pushButton_clicked()
{
//    int value = ui->comboBox->currentIndex();
    if(myserial.isOpen())
    {
        myserial.flush();
        myserial.close();
        ui->pushButton->setText(tr("打開串口"));
        ui->label->setText(tr("串口未打開"));
        if(isSetNum)
        {
            systemSet.btNumber++;
            isSetNum = 0;
        }
        return;
    }
    SetSerialBaudRate();
    SaveSystemSet();
    if(myserial.open(QIODevice::ReadWrite))
    {
        isSetNum = 0;
        myserial.clear();
        ui->pushButton->setText(tr("關閉串口"));
        ui->label->setText(tr("串口已經打開"));
        connect(&myserial,SIGNAL(readyRead()),this,SLOT(ReadCom()));
    }
    else
    {
        QMessageBox::warning(this,tr("打開串口失敗"),tr("串口被佔用"),QMessageBox::Ok);
        return;
    }
}

void MainWindow::ReadCom()
{
    QByteArray temp = myserial.readAll();
    ui->textEdit_2->insertPlainText(temp);
    serialData.append(temp);
    ProcReceiveData();
}

void MainWindow::ProcReceiveData()
{
    ;
}

void MainWindow::SaveSystemSet()
{
    QFile *pfile = new QFile("system.ini");

    if(pfile->open(QIODevice::ReadWrite))
    {
        pfile->write((char *)&systemSet,sizeof(SystemSet));
        pfile->close();
    }
    delete(pfile);
}

void MainWindow::SetSystemParam()
{
    QFile *pfile = new QFile("system.ini");

    systemSet.baudRate = 1;
    systemSet.checkSum = 0;
    systemSet.comName = 0;
    systemSet.dataBits = 3;
    systemSet.stopBits = 0;
    systemSet.btNumber = 66;

    if(!pfile->exists())
    {
/*        pfile->open(QIODevice::ReadWrite);
        pfile->write((char *)&systemSet,sizeof(SystemSet));
        pfile->close();*/
        delete(pfile);
        return;
    }
    if(!pfile->open(QIODevice::ReadWrite))
    {
        delete(pfile);
        return;
    }
    pfile->read((char *)&systemSet,sizeof(SystemSet));

    pfile->close();
    delete(pfile);
}

void MainWindow::SetSerialPortInfo()
{
    QString text;

    ui->comboBox->setCurrentIndex(systemSet.comName);
    ui->comboBox_5->setCurrentIndex(systemSet.baudRate);
    ui->comboBox_2->setCurrentIndex(systemSet.checkSum);
    ui->comboBox_3->setCurrentIndex(systemSet.dataBits);
    ui->comboBox_4->setCurrentIndex(systemSet.stopBits);

    text = "UTA60A";
    text += QString("%1").arg(systemSet.btNumber,4,10,QChar('0'));
    ui->lineEdit->setText(text);
    ui->comboBox_6->setCurrentIndex(5);
}

void MainWindow::SetSerialBaudRate()
{
/*
    switch(systemSet.comName){
    case 0:
        myserial.setPortName("COM1");
        break;
    case 1:
        myserial.setPortName("COM2");
        break;
    case 2:
        myserial.setPortName("COM3");
        break;
    case 3:
        myserial.setPortName("COM4");
        break;
    case 4:
        myserial.setPortName("COM5");
        break;
    default:
        break;
    }
*/
    myserial.setPortName(ui->comboBox->currentText());
    switch (systemSet.baudRate) {
    case 0:
        myserial.setBaudRate(QSerialPort::Baud4800);
        break;
    case 1:
        myserial.setBaudRate(QSerialPort::Baud9600);
        break;
    case 2:
        myserial.setBaudRate(QSerialPort::Baud19200);
        break;
    case 3:
        myserial.setBaudRate(QSerialPort::Baud38400);
        break;
    case 4:
        myserial.setBaudRate(QSerialPort::Baud57600);
        break;
    case 5:
        myserial.setBaudRate(QSerialPort::Baud115200);
        break;
    default:
        break;
    }
    switch (systemSet.checkSum) {
    case 0:
        myserial.setParity(QSerialPort::NoParity);
        break;
    case 1:
        myserial.setParity(QSerialPort::OddParity);
        break;
    case 2:
        myserial.setParity(QSerialPort::EvenParity);
        break;
    default:
        break;
    }
    switch(systemSet.dataBits){
    case 0:
        myserial.setDataBits(QSerialPort::Data5);
        break;
    case 1:
        myserial.setDataBits(QSerialPort::Data6);
        break;
    case 2:
        myserial.setDataBits(QSerialPort::Data7);
        break;
    case 3:
        myserial.setDataBits(QSerialPort::Data8);
        break;
    default:
        break;
    }
    switch(systemSet.stopBits){
    case 0:
        myserial.setStopBits(QSerialPort::OneStop);
        break;
    case 1:
        myserial.setStopBits(QSerialPort::TwoStop);
        break;
    default:
        break;
    }
    myserial.setFlowControl(QSerialPort::NoFlowControl);

}

void MainWindow::on_pushButton_2_clicked()
{
    QString command = "AT+NAME";

    command += ui->lineEdit->text();
    if(myserial.isOpen())
    {
        myserial.write((char *)command.data(),command.count());
        command += "\r\n";
        ui->textEdit->insertPlainText(command);
        cmdFlag |= CMD_SET_NAME;
        waitTime = 3;
    }
}

void MainWindow::on_pushButton_4_clicked()
{
    QString command = "AT+PIN";

    command += ui->lineEdit_2->text();
    if(myserial.isOpen())
    {
        myserial.write((char *)command.data(),command.count());
        command += "\r\n";
        ui->textEdit->insertPlainText(command);
        cmdFlag |= CMD_SET_PIN;
        waitTime = 3;
    }
}

void MainWindow::on_pushButton_3_clicked()
{
    QString command = "AT+";

    if(myserial.isOpen())
    {
/*        if(ui->comboBox_6->currentText() == tr("4800"))*/
        switch (ui->comboBox_6->currentIndex()) {
        case 0:
            command += "BAUD3";
            break;
        case 1:
            command += "BAUD4";
            break;
        case 2:
            command += "BAUD5";
            break;
        case 3:
            command += "BAUD6";
            break;
        case 4:
            command += "BAUD7";
            break;
        case 5:
            command += "BAUD8";
            break;
        default:
            return;
        }
        myserial.write((char *)command.data(),command.count());
        command += "\r\n";
        ui->textEdit->insertPlainText(command);
        cmdFlag |= CMD_SET_BAUD;
        waitTime = 3;
    }
}


void MainWindow::on_pushButton_5_clicked()
{
    QString command = "AT+ROLE=S";

    if(myserial.isOpen())
    {
        myserial.write((char *)command.data(),command.count());
        command += "\r\n";
        ui->textEdit->insertPlainText(command);
        cmdFlag |= CMD_SET_SERVER;
        waitTime = 3;
    }
}



void MainWindow::on_pushButton_6_clicked()
{
    QString command = "AT+VERSION";

    if(myserial.isOpen())
    {
        myserial.write((char *)command.data(),command.count());
        command += "\r\n";
        ui->textEdit->insertPlainText(command);
        cmdFlag |= CMD_GET_VER;
        waitTime = 3;
    }
}


 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章