0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Qt上位機(jī)開發(fā)實戰(zhàn)案例

strongerHuang ? 來源:嵌入式大雜燴 ? 2024-03-13 12:31 ? 次閱讀

對于嵌入式開發(fā)的小伙伴,用Qt寫上位機(jī)是最常見的方法之一,對于有基礎(chǔ)的朋友來來說,相對還是比較簡單。 今天從編寫一個簡單的基于QT的上位機(jī)來體會體會上位機(jī)開發(fā)及認(rèn)識認(rèn)識QT。 我們本次實現(xiàn)的上位機(jī)的功能很簡單:上位機(jī)通過串口來控制開發(fā)板上的一個LED的亮滅。界面如:

b7bd6140-e0d6-11ee-a297-92fbcf53809c.png

演示視頻

QT環(huán)境搭建

在開始編寫上位機(jī)之前我們先來一起搭建一下QT開發(fā)環(huán)境(不然就不是手把手了,哈哈)。

使用VS + QT

使用Qt Creator

這里我們選擇直接使用QT_Creator的方式。

Qt Creator是一個用于Qt開發(fā)的輕量級跨平臺集成開發(fā)環(huán)境。

Qt Creator可帶來兩大關(guān)鍵益處:

提供首個專為支持跨平臺開發(fā)而設(shè)計的集成開發(fā)環(huán)境 (IDE),并確保首次接觸Qt框架的開發(fā)人員能迅速上手和操作。

即使不開發(fā)Qt應(yīng)用程序,Qt Creator也是一個簡單易用且功能強(qiáng)大的IDE。

下面我們來一起安裝Qt Creator。

1、注冊qt賬號

我們需要先注冊一個QT賬號,后面安裝Qt Creator的時候會用到。注冊賬號的地址為:

https://www.qt.io/zh-cn/

b7c509cc-e0d6-11ee-a297-92fbcf53809c.png

b7d14ec6-e0d6-11ee-a297-92fbcf53809c.png

2、下載QT_Creator并安裝

我們在Windows上進(jìn)行開發(fā),安裝Windows版本的Qt Creator。下載地址:

https://download.qt.io/new_archive/qt/5.11/5.11.3/

b7d8fe6e-e0d6-11ee-a297-92fbcf53809c.png

下載得到qt-opensource-windows-x86-5.11.3.exe。然后雙擊安裝,第二步需要輸入賬號密碼,把我們上面注冊好的賬號密碼填入即可。

接下來還需要選擇安裝組件,根據(jù)自己需要進(jìn)行選擇安裝,我安裝的組件如:

b7e7a572-e0d6-11ee-a297-92fbcf53809c.png

安裝完成之后我們桌面上并沒有Qt Creator的快捷方式,需要自己創(chuàng)建。找到Qt Creator的安裝路徑,然后把Qt Creator發(fā)送到桌面快捷方式即可。如:

b7ee500c-e0d6-11ee-a297-92fbcf53809c.png

3、驗證QT_Creator是否安裝成功

我們創(chuàng)建一個簡單的C++工程來驗證一下Qt Creator是否安裝成功。

b7fefbc8-e0d6-11ee-a297-92fbcf53809c.png

b8061476-e0d6-11ee-a297-92fbcf53809c.png

b80c927e-e0d6-11ee-a297-92fbcf53809c.png

b812d53a-e0d6-11ee-a297-92fbcf53809c.png

b81d44fc-e0d6-11ee-a297-92fbcf53809c.png

Qt Creator搭建好之后我們接下來開始編寫我們的上位機(jī)。

編寫一個簡單的上位機(jī)

編寫這個簡單的上位機(jī)我們需要經(jīng)過一下幾個步驟:

上位機(jī)界面設(shè)計。

上位機(jī)邏輯代碼編寫。

添加上位機(jī)圖標(biāo)。

上位機(jī)程序的打包。

上位機(jī)測試驗證。

1、新建一個serial_led工程

b82f0368-e0d6-11ee-a297-92fbcf53809c.png

b846b49a-e0d6-11ee-a297-92fbcf53809c.png

b85416ee-e0d6-11ee-a297-92fbcf53809c.png

b85acf84-e0d6-11ee-a297-92fbcf53809c.png

b8631dba-e0d6-11ee-a297-92fbcf53809c.png

這里需要注意的一點是:工程名及工程路徑不要有中文字符。

另外,QT中有三種基類,這里我們選擇QWidget類。QT的三個基類如:

QMainWindow類:提供一個帶有菜單條,工具條和一個狀態(tài)條的主應(yīng)用程序窗口。

QWidget類:所有用戶界面對象的基類,窗口部件是用戶界面的一個基本單元,它從窗口系統(tǒng)接收鼠標(biāo),鍵盤和其他消息,并在屏幕上繪制自己。

QDialog類:對話框窗口的基類,對話框窗口主要用于短期任務(wù)和用戶進(jìn)行短期通訊的頂級窗口,QDialog可以是模態(tài)對話框或者是非模態(tài)對話框。

我們創(chuàng)建的工程如:

b877def8-e0d6-11ee-a297-92fbcf53809c.png

其中,項目文件.pro文件是用來告訴qmake關(guān)于為這個應(yīng)用程序創(chuàng)建makefile所需要的細(xì)節(jié)。例如,一個源文件和頭文件的列表、任何應(yīng)用程序特定配置。例如,一個必需鏈接的額外庫或者一個額外的包含路徑、都應(yīng)該放到項目文件中。

2、上位機(jī)界面設(shè)計

Qt 一個可視化的界面設(shè)計工具:Qt 設(shè)計器(Qt Designer)。我們雙擊.ui文件就可以進(jìn)入Qt Designer,在Qt Designer中我們可以通過拖動控件的方式來設(shè)計我們的界面,整個界面如:

b87fb5c4-e0d6-11ee-a297-92fbcf53809c.png

我們從左側(cè)的控件區(qū)把我們需要的控件拖動到界面編輯區(qū)中,我們這個簡單地上位機(jī)用到的控件如:

b8947338-e0d6-11ee-a297-92fbcf53809c.png

這里需要注意的是波特率這個下拉框需要雙擊設(shè)置一些備選配置,如:

b8bcf268-e0d6-11ee-a297-92fbcf53809c.png

b8c56556-e0d6-11ee-a297-92fbcf53809c.png

大家可以在左邊地控件區(qū)找到這三種控件拖動到界面編輯器進(jìn)行修改、布局即可。

其中,布局可通過如下組件調(diào)整:

b8cc3db8-e0d6-11ee-a297-92fbcf53809c.png

這幾個組件的功能如:

b8d52c52-e0d6-11ee-a297-92fbcf53809c.png

具體地用法大家可以自己去實操一下。

另外,我們需要給我們使用的控件重新命名,在右側(cè)的對象管理區(qū)進(jìn)行操作。命名為有意義的名字,因為后面編寫代碼會用到。有意義的名字利于編寫易懂的代碼。比如我們修改的名字如:

b8dce848-e0d6-11ee-a297-92fbcf53809c.png

最后,控件的屬性可根據(jù)需要在屬性區(qū)進(jìn)行調(diào)整。

3、上位機(jī)邏輯代碼編寫

(1)添加串口庫、包含串口相關(guān)頭文件

在serial_led.pro文件添加串口庫:

QT+=coreguiserialport

b8ed67a4-e0d6-11ee-a297-92fbcf53809c.png

在widget.h文件包含串口頭文件:

#include
#include

b8fa6efe-e0d6-11ee-a297-92fbcf53809c.png

QSerialPort 類提供了操作串口的各種接口。

QSerialPortInfo 是一個輔助類,可以提供計算機(jī)中可用串口的各種信息。

(2)添加QSerialPort成員

在widget.h的Widget類中添加一個QSerialPort成員:

b900356e-e0d6-11ee-a297-92fbcf53809c.png

(3)創(chuàng)建串口對象、搜索所有可用串口

在Widget構(gòu)造函數(shù)中創(chuàng)建一個串口對象并搜索所有可用串口:

Widget::Widget(QWidget*parent):
QWidget(parent),
ui(newUi::Widget)
{
QStringListserialNamePort;

ui->setupUi(this);
this->setWindowTitle("serial_led");

/*創(chuàng)建一個串口對象*/
serialPort=newQSerialPort(this);

/*搜索所有可用串口*/
foreach(constQSerialPortInfo&inf0,QSerialPortInfo::availablePorts()){
serialNamePort<serialBox->addItems(serialNamePort);
}

b905edc4-e0d6-11ee-a297-92fbcf53809c.png

(4)編寫“打開串口”槽函數(shù)

b9162c84-e0d6-11ee-a297-92fbcf53809c.png

b91faade-e0d6-11ee-a297-92fbcf53809c.png

b92c190e-e0d6-11ee-a297-92fbcf53809c.png

信號和槽是用于對象之間的通信,它是Qt的核心機(jī)制。

當(dāng)某個事件發(fā)生之后,比如,按鈕檢測到自己被點擊了一下,它就會發(fā)出一個信號(signal)。如果有對象對這個信號感興趣,想要處理的信號和自己的一個函數(shù)(稱為槽(slot))綁定來處理這個信號。也就是說,當(dāng)信號發(fā)出時,被連接的槽函數(shù)會自動被回調(diào)。

這里,我們點擊打開串口按鈕會發(fā)出clicked信號,此時對應(yīng)槽函數(shù)on_openButton_clicked會被調(diào)用。下面我們來實現(xiàn)這個槽函數(shù):

voidWidget::on_openButton_clicked()
{
/*串口設(shè)置*/
serialPort->setPortName(ui->serialBox->currentText());
serialPort->setBaudRate(ui->baudrateBox->currentText().toInt());
serialPort->setDataBits(QSerialPort::Data8);
serialPort->setStopBits(QSerialPort::OneStop);
serialPort->setParity(QSerialPort::NoParity);

/*打開串口提示框*/
if(true==serialPort->open(QIODevice::ReadWrite))
{
QMessageBox::information(this,"提示","串口打開成功");
}
else
{
QMessageBox::critical(this,"提示","串口打開失敗");
}
}

這里我們寫死數(shù)據(jù)位、停止位、求校驗位;增加提示框。其中使用QMessageBox需要包含如下頭文件:

#include

(5)編寫“關(guān)閉串口”、“點燈”、“滅燈”槽函數(shù)

按照上面打開串口槽函數(shù)的方法編寫關(guān)閉串口、點燈、滅燈槽函數(shù):

voidWidget::on_closeButton_clicked()
{
serialPort->close();
}

voidWidget::on_onButton_clicked()
{
serialPort->write("ON
");
qDebug("ON
");
}

voidWidget::on_offButton_clicked()
{
serialPort->write("OFF
");
qDebug("OFF
");
}

以上就是上位機(jī)邏輯代碼的編寫。

4、添加上位機(jī)圖標(biāo)

在網(wǎng)上找一個相關(guān)的.ico后綴的圖標(biāo)下載放到我們的工程路徑下,如:

b9329cb6-e0d6-11ee-a297-92fbcf53809c.png

圖標(biāo)下載網(wǎng)址如:

https://www.iconfont.cn/

https://www.iconfont.cn/

然后在我們的serial_led.pro文件中添加如下一行代碼:

RC_ICONS=led.ico

b939903e-e0d6-11ee-a297-92fbcf53809c.png

5、上位機(jī)程序打包

我們上面運(yùn)行的上位機(jī)都是在Qt Creator中編譯運(yùn)行的,如果我們需要把編寫好的可執(zhí)行文件發(fā)送給別人使用的話還需要進(jìn)行打包。

上面我們的工程是Debug版本的:

b94484f8-e0d6-11ee-a297-92fbcf53809c.png

打包之前,我們先把工程修改為Release版本:

b956ae6c-e0d6-11ee-a297-92fbcf53809c.png

然后在我們工程目錄下得到:

b963d146-e0d6-11ee-a297-92fbcf53809c.png

此時,雙擊release文件夾下的serial_led.exe文件是會報錯的,報錯原因是找不到一些相關(guān)的動態(tài)庫:

b9749d28-e0d6-11ee-a297-92fbcf53809c.png

我們新建一個文件夾保存我們的打包文件,如:

b97a37ba-e0d6-11ee-a297-92fbcf53809c.png

把build-serial_led-Desktop_Qt_5_11_1_MinGW_32bit-Release elease路徑下的serial_led.exe文件拷貝至serial_led_packet文件夾中:

b980f23a-e0d6-11ee-a297-92fbcf53809c.png

打開QT for Disktop工具:

b986766a-e0d6-11ee-a297-92fbcf53809c.png

b9967218-e0d6-11ee-a297-92fbcf53809c.png

執(zhí)行如下命令進(jìn)入打包目錄:

cd /d D:Qtqt_prjserial_ledserial_led_packet

然后執(zhí)行如下命令進(jìn)行打包:

windeployqt serial_led.exe

b9a1b844-e0d6-11ee-a297-92fbcf53809c.png

此時,serial_led_packet文件夾中的serial_led.exe文件就可以雙擊運(yùn)行了:

b9b8465e-e0d6-11ee-a297-92fbcf53809c.png

此時就完成了程序的打包。此時我們把這一整個文件夾壓縮發(fā)送給別人使用了。另外,我們也可以借助一些工具把這些文件打包成一個整體的.exe文件,這里不再介紹。

6、上位機(jī)測試驗證

上位機(jī)我們寫好了,接下來編寫下位機(jī)代碼來測試一下。

我們點擊上位機(jī)的點燈、滅燈按鈕,則會通過串口分別發(fā)送ON 、OFF ,我們編寫下位機(jī)代碼進(jìn)行接收,然后操控LED燈即可。

下位機(jī)是小熊派IOT開發(fā)板,測試代碼如:

intmain(void)
{
/*USERCODEBEGIN1*/

/*USERCODEEND1*/

/*MCUConfiguration----------------------------------------------------------*/

/*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/
HAL_Init();

/*USERCODEBEGINInit*/

/*USERCODEENDInit*/

/*Configurethesystemclock*/
SystemClock_Config();

/*USERCODEBEGINSysInit*/

/*USERCODEENDSysInit*/

/*Initializeallconfiguredperipherals*/
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
/*USERCODEBEGIN2*/
printf("WelcometoUART1test!
");

/*USERCODEEND2*/

/*Infiniteloop*/
/*USERCODEBEGINWHILE*/
while(1)
{

/*USERCODEENDWHILE*/

/*USERCODEBEGIN3*/
if(HAL_UART_Receive(&huart1,&Rdata,1,0)==HAL_OK)
{
if(usart_rx_buf_index>USART1_RX_BUF_LEN-1)
{
usart_rx_buf_index=0;
}

if(Rdata==0x0A)
{
if(strcmp((char*)USART1_RX_BUF,"ON")==0)
{
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
}
elseif(strcmp((char*)USART1_RX_BUF,"OFF")==0)
{
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
}
usart_rx_buf_index=0;
memset(USART1_RX_BUF,0,USART1_RX_BUF_LEN);
}
else
{
USART1_RX_BUF[usart_rx_buf_index++]=Rdata;
}
}
}
/*USERCODEEND3*/

}

演示如文章開頭所見。

總結(jié)

以上就是手把手教你編寫一個簡單的點燈上位機(jī)的內(nèi)容,雖然實現(xiàn)的功能很簡單,但是QT上位機(jī)開發(fā)的步驟基本就是這些步驟,通過這個基礎(chǔ)實例把這些套路摸透我們就可以接著進(jìn)行后續(xù)更多QT程序地開發(fā)學(xué)習(xí)了。

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • led
    led
    +關(guān)注

    關(guān)注

    240

    文章

    22905

    瀏覽量

    650083
  • 嵌入式開發(fā)
    +關(guān)注

    關(guān)注

    18

    文章

    1006

    瀏覽量

    47352
  • 上位機(jī)
    +關(guān)注

    關(guān)注

    27

    文章

    927

    瀏覽量

    54546
  • 串口控制
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    9841

原文標(biāo)題:手把手教你用Qt寫一個上位機(jī)

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C#上位機(jī)實戰(zhàn)開發(fā)指南

    C#上位機(jī)實戰(zhàn)開發(fā)指南
    發(fā)表于 11-22 19:25 ?0次下載

    QtQt Quick開發(fā)實戰(zhàn)精解電子教材的源代碼合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是QtQt Quick開發(fā)實戰(zhàn)精解電子教材的源代碼合集免費(fèi)下載
    發(fā)表于 10-31 17:56 ?141次下載

    【北京迅為】嵌入式Linux+QT開發(fā)零基礎(chǔ)入門+項目實戰(zhàn)教程分享

    每一個技術(shù)點都能真真切切落實到項目中,學(xué)即所用。1、獨創(chuàng)框架學(xué)習(xí)法,先掌握整體的 QT 開發(fā),在逐一擊破!2、手把手教學(xué),從 Windows 到 Linux 在到 QT,從 C ++直到 QT
    發(fā)表于 11-01 17:59 ?28次下載
    【北京迅為】嵌入式Linux+<b class='flag-5'>QT</b><b class='flag-5'>開發(fā)</b>零基礎(chǔ)入門+項目<b class='flag-5'>實戰(zhàn)</b>教程分享

    【STM32】自動氣象站(下位機(jī):STM32 + 上位機(jī)QT)

    【STM32】自動氣象站(下位機(jī):STM32 + 上位機(jī)QT)
    發(fā)表于 11-19 12:36 ?58次下載
    【STM32】自動氣象站(下位<b class='flag-5'>機(jī)</b>:STM32 + <b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b>:<b class='flag-5'>QT</b>)

    QT從零開始作單片機(jī)上位機(jī)-串口調(diào)試助手+波形顯示

    第一章 QT開發(fā)環(huán)境搭建及工程文件建立前言:筆者本想用codeblock+QT搭建一個上位機(jī)開發(fā)
    發(fā)表于 01-12 19:13 ?20次下載
    <b class='flag-5'>QT</b>從零開始作單片機(jī)<b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b>-串口調(diào)試助手+波形顯示

    基于QT的簡單的上位機(jī)

    。同樣的,我們也從編寫一個簡單的基于QT上位機(jī)來體會體會上位機(jī)開發(fā)及認(rèn)識認(rèn)識
    發(fā)表于 05-08 10:57 ?16次下載
    基于<b class='flag-5'>QT</b>的簡單的<b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b>

    QTQT上位機(jī)串口編程

    QTQT上位機(jī)串口編程 最近因為項目需要,需要用到上位機(jī),通過串口與
    發(fā)表于 05-08 10:02 ?25次下載
    <b class='flag-5'>QT</b>篇<b class='flag-5'>QT</b><b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b>串口編程

    QT|編寫一個簡單的上位機(jī)

    QT | 編寫一個簡單的上位機(jī) 時間 :2023-03-19文章目錄QT | 編寫一個簡單的上位機(jī)
    發(fā)表于 05-08 10:12 ?3次下載
    <b class='flag-5'>QT</b>|編寫一個簡單的<b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b>

    QT實現(xiàn)簡單的上位機(jī)軟件

    最近項目要求寫上位機(jī)軟件,需要實現(xiàn)界面功能和串口讀寫。界面方面用過MFC(早忘記了),網(wǎng)上查閱資料后發(fā)現(xiàn)QT在5.1版本后有自帶的串口模塊,而且用QT實現(xiàn)簡單界面功能很容易上手(也就期
    發(fā)表于 05-08 09:54 ?4次下載
    <b class='flag-5'>QT</b>實現(xiàn)簡單的<b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b>軟件

    STM32+ESP8266連接電腦Qt網(wǎng)絡(luò)上位機(jī)——QT

    本文簡單介紹下手寫網(wǎng)絡(luò)調(diào)試器并連接ESP8266模塊 上篇 : STM32+ESP8266連接電腦Qt網(wǎng)絡(luò)上位機(jī)——準(zhǔn)備工作 目錄 一、部分Qt代碼及實現(xiàn)過程 二、實現(xiàn)過程——使用
    發(fā)表于 05-09 14:22 ?21次下載
    STM32+ESP8266連接電腦<b class='flag-5'>Qt</b>網(wǎng)絡(luò)<b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b>——<b class='flag-5'>QT</b>篇

    QT串口數(shù)據(jù)接收上位機(jī)

    QT串口數(shù)據(jù)接收上位機(jī)1.界面設(shè)計 2.串口配置 3.文件讀寫 4.使用QT遇到的一些問題 5.excle保存數(shù)據(jù) 6.上位
    發(fā)表于 05-09 14:26 ?2次下載
    <b class='flag-5'>QT</b>串口數(shù)據(jù)接收<b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b>

    基于Qt的簡單arduino上位機(jī)

    準(zhǔn)備工作 一塊esp8266,安裝arduinoIDE、Qt、navecate、mysql/**若沒有mysql可直接采用sqllist。 QT上位機(jī) 通信協(xié)議采用UDP(TCP
    發(fā)表于 05-09 10:36 ?3次下載
    基于<b class='flag-5'>Qt</b>的簡單arduino<b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b>

    Qt上位機(jī)開發(fā)實戰(zhàn)(一)

    一、Qt三大金剛 1、qt下的串口編程 2、qt下的網(wǎng)絡(luò)編程 3、qt下的GPIO 本章節(jié)先介紹一下qt下的串口編程,首先我們新建一個Wid
    發(fā)表于 05-10 11:35 ?3次下載
    <b class='flag-5'>Qt</b>之<b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實戰(zhàn)</b>(一)

    QT設(shè)計風(fēng)速儀上位機(jī)實例

    本人之前所做項目需要使用風(fēng)速儀進(jìn)行風(fēng)速檢測,市面上所購買的風(fēng)速儀產(chǎn)品可以多通過串口與上位機(jī)進(jìn)行通信,為滿足后續(xù)需求且提高更高的靈活性,本人決定采用QT軟件自主開發(fā)風(fēng)速儀
    發(fā)表于 05-10 09:41 ?1次下載
    <b class='flag-5'>QT</b>設(shè)計風(fēng)速儀<b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b>實例

    EtherCAT運(yùn)動控制器上位機(jī)之Python+Qt(一):鏈接與單軸運(yùn)動

    PC上位機(jī)Python+Qt混合編程,助力智能制造高效開發(fā)。
    的頭像 發(fā)表于 07-31 09:43 ?195次閱讀
    EtherCAT運(yùn)動控制器<b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b>之Python+<b class='flag-5'>Qt</b>(一):鏈接與單軸運(yùn)動