串口調試助手 該程式使用Qt框架,C ++語言編譯而成 項目文件介紹: 該文件中獲取串口是通過讀取Windows系統下的註冊表中的信息得到的, - 使用Qt中的定時器來每個3s讀取一次註冊表 串口通信方面:通過使用Qt的封裝的QSerialPort來實現 main.cpp mainwindow.h ...
串口調試助手----------該程式使用Qt框架,C ++語言編譯而成
項目文件介紹:
main.cpp 該文件為該程式的入口程式
mainwindow.h 該文件為該程式的主要聲明部分
mainwindow.cpp 該文件為該程式的主要定義部分
mainwindow.ui 該文件為該程式的ui界面設計
界面.png 界面的顯示效果
該文件中獲取串口是通過讀取Windows系統下的註冊表中的信息得到的, - 使用Qt中的定時器來每個3s讀取一次註冊表
串口通信方面:通過使用Qt的封裝的QSerialPort來實現
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 <QSerialPort> #include <QTimer> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); /* * 功能:獲取電腦中串口的埠 * 參數:無 * 返回值:無 */ void Get_Serial_Port(void); /* * 功能:當串口有數據的時候執行 * 參數:無 * 返回值:無 */ void readData(void); /* * 功能:每個3s執行的任務 * 參數:無 * 返回值:無 */ void myThread(void); private slots: /* * 功能:點擊pushButton按鈕功能 * 參數:無 * 返回值:無 */ void on_pushButton_clicked(); /* * 功能:點擊清空按鈕功能,清空顯示區的顯示 * 參數:無 * 返回值:無 */ void on_pushButton_2_clicked(); void on_pushButton_3_clicked(); void on_pushButton_4_clicked(); void on_pushButton_5_clicked(); private: Ui::MainWindow *ui; //串口類指針 QSerialPort *Serial; //時間類指針 QTimer *time; }; #endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include "windows.h" #include "QVector" #include "QDebug" #include "stdio.h" #include "QMessageBox" #include <stdlib.h> #define MAX_KEY_LENGTH 255 #define MAX_VALUE_NAME 16383 /* * 功能:讀取註冊表下的子項 * 參數:hkey:註冊表的根 * lpSubkey:註冊表根下的路徑 * retArray:返回要查找的路徑下的值的數組 * 返回值:無 */ static void Get_Regedit(HKEY hkey,LPCSTR lpSubKey,QVector<QString> &retArray); MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //時間類初始化 time = new QTimer(this); connect(time,&QTimer::timeout,this,&MainWindow::myThread); time->start(3000); //狀態欄顯示 ui->statusBar->showMessage("程式運行中..."); //初始化串口的顯示 this->Get_Serial_Port(); QStringList temp; //波特率的顯示 temp << "9600" << "4800" << "19200" << "38400" << "57600" << "115200"; ui->comboBox_2->addItems(temp); //數據位的顯示 temp.clear(); temp << "8" << "5" << "6" << "7"; ui->comboBox_3->addItems(temp); //奇偶檢驗位的顯示 temp.clear(); temp << "0" << "1" << "2"; ui->comboBox_4->addItems(temp); //停止位的顯示 temp.clear(); temp << "1" << "1.5" << "2"; ui->comboBox_5->addItems(temp); this->Serial = new QSerialPort(nullptr); } MainWindow::~MainWindow() { delete ui; } /* * 功能:獲取電腦中串口的埠 * 參數:無 * 返回值:無 */ void MainWindow::Get_Serial_Port() { QVector<QString> retArray; ui->comboBox->clear(); Get_Regedit(HKEY_LOCAL_MACHINE,\ "HARDWARE\\DEVICEMAP\\SERIALCOMM",\ retArray); qDebug() << retArray.size(); QVector<QString>::iterator iter; for (iter=retArray.begin();iter!=retArray.end();iter++) { qDebug() << *iter << "\0"; ui->comboBox->addItem(*iter); } } /* * 功能:點擊pushButton按鈕功能,打開串口 * 參數:無 * 返回值:無 */ void MainWindow::on_pushButton_clicked() { if(!Serial->isOpen()) { qDebug() << ui->comboBox->currentText(); //設置串口的埠名稱 Serial->setPortName(ui->comboBox->currentText()); //toInt:將字元串轉換為數字 //設置串口的波特率 Serial->setBaudRate((ui->comboBox_2->currentText()).toInt(nullptr,10)); //設置串口的數據位 Serial->setDataBits((QSerialPort::DataBits((ui->comboBox_3->currentText()).toInt(nullptr,10)))); //設置串口的奇偶校驗位 Serial->setParity(QSerialPort::Parity((ui->comboBox_4->currentText()).toInt(nullptr,10))); //設置串口的停止位 Serial->setStopBits(QSerialPort::StopBits((ui->comboBox_5->currentText()).toInt(nullptr,10))); //設置串口的流 Serial->setFlowControl(QSerialPort::NoFlowControl); BOOL isSerial = Serial->open(QIODevice::ReadWrite); if(!isSerial) { qDebug() << "串口打開錯誤!"; return; } //創建一個信號與槽,使得串口有數據可以讀取的時候可以執行readData()函數 connect(Serial,&QSerialPort::readyRead,this,&MainWindow::readData); ui->pushButton->setText("已啟動"); } else { ui->pushButton->setText("啟動"); Serial->close(); } } /* * 功能:讀取註冊表下的子項 * 參數:hkey:註冊表的根 * lpSubkey:註冊表根下的路徑 * retArray:返回要查找的路徑下的值的數組 * 返回值:無 */ static void Get_Regedit(HKEY hkey,LPCSTR lpSubKey,QVector<QString> &retArray) { HKEY phkey = nullptr; BOOL isSuccess = false; /* * 功能:打開註冊表,返回值為是否打開成功 */ isSuccess = RegOpenKeyA(hkey,lpSubKey,&phkey); if(isSuccess != ERROR_SUCCESS) { qDebug() << "註冊表打開失敗!"; return; } qDebug() << "註冊表打開成功!"; /* * 功能:讀取註冊表下的子項 */ DWORD i =0; LSTATUS retCode = ERROR_SUCCESS; CHAR achValue[MAX_VALUE_NAME]; DWORD cchValue = MAX_VALUE_NAME; BYTE Data[MAX_VALUE_NAME]; DWORD cbData = MAX_VALUE_NAME; do { cchValue = MAX_VALUE_NAME; cbData = MAX_VALUE_NAME; achValue[0] = '\0'; Data[0] = '\0'; QString temp = ""; retCode = RegEnumValueA(phkey, i,achValue,&cchValue,nullptr,nullptr,Data,&cbData); if (retCode == ERROR_SUCCESS && achValue[0] != '\0') { qDebug() << i++ << achValue << " "; BYTE j = 0; while(Data[j] != '\0') temp += (CHAR)(Data[j++]); qDebug() << temp; retArray.append(temp); } }while(achValue[0] != '\0'); /* * 功能:關閉註冊表,返回值為是否打開成功 */ isSuccess = RegCloseKey(phkey); if(isSuccess != ERROR_SUCCESS) { qDebug() << "註冊表關閉失敗!"; return; } qDebug() << "註冊表關閉成功!"; return; } /* * 功能:點擊清空按鈕功能,清空顯示區的顯示 * 參數:無 * 返回值:無 */ void MainWindow::on_pushButton_2_clicked() { ui->textBrowser->setText(""); } /* * 功能:當串口有數據的時候執行,在顯示區域顯示 * 串口接受到的值 * 參數:無 * 返回值:無 */ void MainWindow::readData(void) { //是否選擇了該按鈕,選擇以16進位進行輸出 if(ui->radioButton->isChecked()) { QByteArray temp = Serial->readAll().toHex(); for(int i = 0;i < temp.length();++i) { //在16進位開始加入"0x" if(i % 2 == 0) ui->textBrowser->insertPlainText("0x"); ui->textBrowser->insertPlainText((QString)temp.at(i)); //在16進位結束加上空格" " if(i % 2 == 1) ui->textBrowser->insertPlainText(" "); } } //沒有選擇則按照ASCII碼輸出 else ui->textBrowser->insertPlainText(Serial->readAll()); ui->textBrowser->moveCursor(QTextCursor::End); } /* * 功能:向串口中發送數據 * 參數:無 * 返回值:無 */ void MainWindow::on_pushButton_3_clicked() { //判斷串口是否處於打開狀態 if(Serial->isOpen()) { QByteArray temp = ui->textEdit->toPlainText().toUtf8(); qDebug() << temp; Serial->write(temp); } else { //串口沒有連接的時候發送數據就會出錯 QMessageBox messageBox(QMessageBox::Icon(2),"警告","串口未連接",QMessageBox::Yes,nullptr); messageBox.exec(); } } /* * 功能:清空發送區 * 參數:無 * 返回值:無 */ void MainWindow::on_pushButton_4_clicked() { ui->textEdit->clear(); } /* * 功能:退出程式 * 參數:無 * 返回值:無 */ void MainWindow::on_pushButton_5_clicked() { if(Serial->isOpen()) Serial->close(); this->close(); } /* * 功能:每個3s執行的任務,判斷埠和串口是否打開 * 參數:無 * 返回值:無 */ void MainWindow::myThread() { qDebug() << "線程OK "; if(Serial->isReadable()) ui->pushButton->setText("已啟動"); else ui->pushButton->setText("啟動"); this->Get_Serial_Port(); }
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>768</width> <height>500</height> </rect> </property> <property name="minimumSize"> <size> <width>768</width> <height>500</height> </size> </property> <property name="maximumSize"> <size> <width>768</width> <height>500</height> </size> </property> <property name="windowTitle"> <string>串口助手</string> </property> <widget class="QWidget" name="centralWidget"> <widget class="QPushButton" name="pushButton"> <property name="geometry"> <rect> <x>20</x> <y>230</y> <width>93</width> <height>28</height> </rect> </property> <property name="text"> <string>啟動</string> </property> </widget> <widget class="QPushButton" name="pushButton_2"> <property name="geometry"> <rect> <x>120</x> <y>290</y> <width>93</width> <height>28</height> </rect> </property> <property name="text"> <string>清空顯示</string> </property> </widget> <widget class="QComboBox" name="comboBox"> <property name="geometry"> <rect> <x>120</x> <y>50</y> <width>87</width> <height>22</height> </rect> </property> </widget> <widget class="QComboBox" name="comboBox_2"> <property name="geometry"> <rect> <x>120</x> <y>80</y> <width>87</width> <height>22</height> </rect> </property> </widget> <widget class="QComboBox" name="comboBox_3"> <property name="geometry"> <rect> <x>120</x> <y>110</y> <width>87</width> <height>22</height> </rect> </property> </widget> <widget class="QComboBox" name="comboBox_4"> <property name="geometry"> <rect> <x>120</x> <y>140</y> <width>87</width> <height>22</height> </rect> </property> </widget> <widget class="QComboBox" name="comboBox_5"> <property name="geometry"> <rect> <x>120</x> <y>170</y> <width>87</width> <height>22</height> </rect> </property> </widget> <widget class="QRadioButton" name="radioButton"> <property name="geometry"> <rect> <x>0</x> <y>295</y> <width>115</width> <height>19</height> </rect> </property> <property name="text"> <string>以16進位輸出</string> </property> </widget> <widget class="QPushButton" name="pushButton_3"> <property name="geometry"> <rect> <x>120</x> <y>360</y> <width>93</width> <height>28</height> </rect> </property> <property name="text"> <string>發送</string> </property> </widget> <widget class="QGroupBox" name="groupBox"> <property name="geometry"> <rect> <x>230</x> <y>4</y> <width>551</width> <height>331</height> </rect> </property> <property name="title"> <string>接受顯示區</string> </property> <widget class="QTextBrowser" name="textBrowser"> <property name="geometry"> <rect> <x>10</x> <y>20</y> <width>521</width> <height>301</height> </rect> </property> </widget> </widget> <widget class="QGroupBox" name="groupBox_2"> <property name="geometry"> <rect> <x>230</x> <y>340</y> <width>541</width> <height>121</height> </rect> </property> <property name="title"> <string>發送顯示區</string> </property> <widget class="QTextEdit" name="textEdit"> <property name="geometry"> <rect> <x>10</x> <y>20</y> <width>521</width> <