在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

最詳細編寫上位機教程

strongerHuang ? 來源:嵌入式大雜燴 ? 作者:ZhengN ? 2021-04-27 10:26 ? 次閱讀

嵌入式開發,基本都會用到有一些上位機工具,比如串口助手就是最常用的工具之一。

那么,今天分享有一篇由ZhengN整理的用Qt寫的簡單上位機教程。

一、前言

大家好,我是ZhengN,本次來教大家編寫一個基于QT的簡單的上位機。

學習一個新的東西我們都從最基礎地實例開始,比如學習C語言我們會從編寫一個hello程序開始、學習嵌入式我們從點燈開始。

同樣的,我們也從編寫一個簡單的基于QT的上位機來體會體會上位機開發及認識認識QT。

我們本次實現的上位機的功能很簡單:上位機通過串口來控制開發板上的一個LED的亮滅。界面如:

二、QT環境搭建

在開始編寫上位機之前我們先來一起搭建一下QT開發環境(不然就不是手把手了,哈哈)。往期推文 QT | 詳解Qt的幾種開發方式 中有介紹到QT的兩種開發環境:

使用VS + QT

使用Qt Creator

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

Qt Creator是一個用于Qt開發的輕量級跨平臺集成開發環境。

Qt Creator可帶來兩大關鍵益處:

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

即使不開發Qt應用程序,Qt Creator也是一個簡單易用且功能強大的IDE。

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

1、注冊qt賬號

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

2、下載QT_Creator并安裝

我們在Windows上進行開發,安裝Windows版本的Qt Creator。

64e00768-a680-11eb-aece-12bb97331649.png

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

接下來還需要選擇安裝組件,根據自己需要進行選擇安裝,我安裝的組件如:

64e9ea62-a680-11eb-aece-12bb97331649.png

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

64f4042a-a680-11eb-aece-12bb97331649.png

3、驗證QT_Creator是否安裝成功

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

6503c7e8-a680-11eb-aece-12bb97331649.png

6510d00a-a680-11eb-aece-12bb97331649.png

65436506-a680-11eb-aece-12bb97331649.png

65582aea-a680-11eb-aece-12bb97331649.png

656a5e4a-a680-11eb-aece-12bb97331649.png

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

三、編寫一個簡單的上位機

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

上位機界面設計。

上位機邏輯代碼編寫。

添加上位機圖標。

上位機程序的打包。

上位機測試驗證。

1、新建一個serial_led工程

65bcdd00-a680-11eb-aece-12bb97331649.png

65c94176-a680-11eb-aece-12bb97331649.png

65f768da-a680-11eb-aece-12bb97331649.png

660d9862-a680-11eb-aece-12bb97331649.png

6618b9e0-a680-11eb-aece-12bb97331649.png

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

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

QMainWindow類:提供一個帶有菜單條,工具條和一個狀態條的主應用程序窗口。

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

QDialog類:對話框窗口的基類,對話框窗口主要用于短期任務和用戶進行短期通訊的頂級窗口,QDialog可以是模態對話框或者是非模態對話框。

我們創建的工程如:

66241358-a680-11eb-aece-12bb97331649.png

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

2、上位機界面設計

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

664100c6-a680-11eb-aece-12bb97331649.png

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

66514332-a680-11eb-aece-12bb97331649.png

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

66601394-a680-11eb-aece-12bb97331649.png

6672b1b6-a680-11eb-aece-12bb97331649.png

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

其中,布局可通過如下組件調整:

667db610-a680-11eb-aece-12bb97331649.png

這幾個組件的功能如:

668aaaf0-a680-11eb-aece-12bb97331649.png

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

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

6698acb8-a680-11eb-aece-12bb97331649.png

最后,控件的屬性可根據需要在屬性區進行調整。

3、上位機邏輯代碼編寫

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

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

QT += core gui serialport

66a80bc2-a680-11eb-aece-12bb97331649.png

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

#include 《QSerialPort》

#include 《QSerialPortInfo》

66d79112-a680-11eb-aece-12bb97331649.png

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

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

(2)添加QSerialPort成員

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

66e15ce2-a680-11eb-aece-12bb97331649.png

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

在Widget構造函數中創建一個串口對象并搜索所有可用串口:

Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

QStringList serialNamePort;

ui-》setupUi(this);

this-》setWindowTitle(“serial_led”);

/* 創建一個串口對象 */

serialPort = new QSerialPort(this);

/* 搜索所有可用串口 */

foreach (const QSerialPortInfo &inf0, QSerialPortInfo::availablePorts()) {

serialNamePort《《inf0.portName();

}

ui-》serialBox-》addItems(serialNamePort);

}

66eb3960-a680-11eb-aece-12bb97331649.png

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

66f57a38-a680-11eb-aece-12bb97331649.png

67350068-a680-11eb-aece-12bb97331649.png

675e4b94-a680-11eb-aece-12bb97331649.png

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

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

這里,我們點擊打開串口按鈕會發出clicked信號,此時對應槽函數on_openButton_clicked會被調用。下面我們來實現這個槽函數:

void Widget::on_openButton_clicked()

{

/* 串口設置 */

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, “提示”, “串口打開失敗”);

}

}

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

#include 《QMessageBox》

(5)編寫“關閉串口”、“點燈”、“滅燈”槽函數

按照上面打開串口槽函數的方法編寫關閉串口、點燈、滅燈槽函數:

void Widget::on_closeButton_clicked()

{

serialPort-》close();

}

void Widget::on_onButton_clicked()

{

serialPort-》write(“ON

”);

qDebug(“ON

”);

}

void Widget::on_offButton_clicked()

{

serialPort-》write(“OFF

”);

qDebug(“OFF

”);

}

以上就是上位機邏輯代碼的編寫。

4、添加上位機圖標

在網上找一個相關的.ico后綴的圖標下載放到我們的工程路徑下,如:

677763ea-a680-11eb-aece-12bb97331649.png

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

RC_ICONS = led.ico

67803a2e-a680-11eb-aece-12bb97331649.png

5、上位機程序打包

我們上面運行的上位機都是在Qt Creator中編譯運行的,如果我們需要把編寫好的可執行文件發送給別人使用的話還需要進行打包。

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

6788ff38-a680-11eb-aece-12bb97331649.png

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

67954bc6-a680-11eb-aece-12bb97331649.png

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

67ae9680-a680-11eb-aece-12bb97331649.png

此時,雙擊release文件夾下的serial_led.exe文件是會報錯的,報錯原因是找不到一些相關的動態庫:

67c2ae18-a680-11eb-aece-12bb97331649.png

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

67d1595e-a680-11eb-aece-12bb97331649.png

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

67e8f7e4-a680-11eb-aece-12bb97331649.png

打開QT for Disktop工具:

67f820c0-a680-11eb-aece-12bb97331649.png

684f52a0-a680-11eb-aece-12bb97331649.png

執行如下命令進入打包目錄:

cd /d D:Qtqt_prjserial_ledserial_led_packet

然后執行如下命令進行打包:

windeployqt serial_led.exe

6863929c-a680-11eb-aece-12bb97331649.png

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

689b4a20-a680-11eb-aece-12bb97331649.png

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

6、上位機測試驗證

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

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

下位機是小熊派IOT開發板,測試代碼如:

int main(void)

{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration----------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */

SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_DMA_Init();

MX_USART1_UART_Init();

/* USER CODE BEGIN 2 */

printf(“Welcome to UART1 test!

”);

/* USER CODE END 2 */

/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

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);

}

else if (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;

}

}

}

/* USER CODE END 3 */

}

演示如文章開頭所見。

四、總結

以上就是手把手教你編寫一個簡單的點燈上位機的內容,雖然實現的功能很簡單,但是QT上位機開發的步驟基本就是這些步驟,通過這個基礎實例把這些套路摸透我們就可以接著進行后續更多QT程序地開發學習了。
編輯:lyn

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 上位機
    +關注

    關注

    27

    文章

    944

    瀏覽量

    54885
  • Qt
    Qt
    +關注

    關注

    1

    文章

    307

    瀏覽量

    37963
  • 編寫
    +關注

    關注

    0

    文章

    29

    瀏覽量

    8479

原文標題:手把手教你編寫一個上位機

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    上位系統架構分析 上位與下位的區別

    上位系統架構分析 1. 上位的定義與作用 上位通常指的是在控制系統中負責決策、數據處理和用
    的頭像 發表于 12-04 10:17 ?643次閱讀

    上位與三菱PLC的通信過程

    ,其與上位之間的通信方式和實現原理備受關注。本文將詳細闡述上位與三菱PLC的通信過程,包括通信協議的選擇、網絡參數的配置、通信程序的
    的頭像 發表于 06-18 11:00 ?1942次閱讀

    上位與PLC的以太網通信方法

    的首選方式。本文將詳細介紹上位與PLC的以太網通信方法,包括硬件連接、通信協議選擇、IP地址設置、通信參數配置、通信程序編寫以及數據交換等方面。
    的頭像 發表于 06-18 09:13 ?3476次閱讀

    上位控制伺服驅動器的作用是什么

    上位控制伺服驅動器的作用是實現對伺服驅動器的精確控制,以滿足各種工業自動化應用的需求。本文將詳細介紹上位控制伺服驅動器的作用、原理、特點
    的頭像 發表于 06-06 10:55 ?913次閱讀

    上位控制界面用什么做好

    優秀的上位控制界面應具備易用性、可擴展性、穩定性和安全性等特點。本文將詳細介紹如何選擇合適的開發工具和框架,以及設計和實現一個高效的上位
    的頭像 發表于 06-06 10:54 ?980次閱讀

    上位可以控制plc輸入點嗎

    一、引言 隨著工業自動化技術的不斷發展,上位與PLC(可編程邏輯控制器)的結合應用越來越廣泛。上位作為人機交互界面,可以方便地實現對PLC的監控和控制。本文將
    的頭像 發表于 06-06 10:51 ?1286次閱讀

    上位軟件開發用什么語言

    維護的上位軟件至關重要。本文將詳細介紹幾種常用的上位軟件開發編程語言,并分析它們的優缺點。 C/C++ C和C++是兩種廣泛使用的編程語
    的頭像 發表于 06-06 10:44 ?1979次閱讀

    上位如何控制下位機運行

    。本文將詳細介紹上位如何控制下位機運行的方法、步驟和注意事項。 1. 上位與下位的基本概念
    的頭像 發表于 06-06 10:33 ?1551次閱讀

    上位和下位是什么意思 上位和下位的區別

    上位和下位是計算機控制系統中兩個重要的概念,它們在控制、通信和數據處理等方面發揮著關鍵作用。在本文中,我們將詳細探討上位
    的頭像 發表于 06-06 10:11 ?6027次閱讀

    上位怎么給plc信號輸出

    本文詳細介紹了上位與PLC之間的通信原理、配置方法以及實現信號輸出的步驟。 一、引言 隨著工業自動化的不斷發展,上位與PLC之間的通信變
    的頭像 發表于 06-06 10:07 ?1736次閱讀

    上位與plc通訊延遲怎么解決

    在自動化控制系統中,上位與PLC(可編程邏輯控制器)之間的通信是實現遠程監控、控制和數據交換的關鍵。然而,通信延遲問題可能會導致系統性能下降,影響生產效率。本文將詳細探討上位
    的頭像 發表于 06-06 09:58 ?4094次閱讀

    STM8S如何用VC++編寫上位程序?

    使用STM8S單片,編譯環境使用IAR.問題如下: 1:如何用VC++編寫上位程序,實現:可將燒錄hex或bin文件的數據讀取,然后加上包頭碼,長度和校驗和等字節后通過串口發送。哪位大俠有類似
    發表于 05-13 06:44

    請問上位軟件怎樣接收ST-LINK上傳給PC的燒錄反饋信息?

    本人工作原因要用C#編寫上位軟件,通過調用批處理文件(調用ST-LINK_CLI.exe)完成STM32芯片燒錄。 現在遇到的問題是,我的上位軟件怎么接收ST-LINK-V2的反饋
    發表于 04-09 08:10

    什么是上位上位和下位的區別

    上位和下位之間的通信通常通過各種通信協議進行,包括但不限于RS232、RS485、CAN總線、以太網等。
    的頭像 發表于 02-19 15:40 ?1.7w次閱讀
    什么是<b class='flag-5'>上位</b><b class='flag-5'>機</b>?<b class='flag-5'>上位</b><b class='flag-5'>機</b>和下位<b class='flag-5'>機</b>的區別

    請問下位上位如何保持時鐘同步呢?

    。本文將詳細介紹下位上位如何進行時鐘同步,并探討一些常見的技術和方法。 首先,讓我們了解一下時鐘同步的基本原理。在系統中,時鐘被用于指導事件的發生和處理。在下位
    的頭像 發表于 01-16 17:11 ?1578次閱讀
    主站蜘蛛池模板: 狠狠躁夜夜躁人人爽天天段| 一级免费黄色片| 日本三级成人午夜视频网 | 在线天堂中文| 国产亚洲一区二区三区在线 | ass嫩美女胴体| 亚洲操图| 免费午夜视频在线观看| 国产精品福利视频手机免费观看 | 亚洲禁片| 欧美黑人换爱交换乱理伦片| 成人深夜视频| 亚综合| 狠狠色噜噜狠狠狠狠97老肥女| 中文字幕11页| 亚洲va国产va天堂va久久| 日本一区二区不卡在线| 男女视频在线看| 午夜男人网| 六月婷婷久久| 久久久精品久久久久久久久久久 | 亚洲日本精品| 日本三级黄色网址| 国产精品毛片在线大全| 午夜逼逼| 爱夜夜性夜夜夜夜夜夜爽| 中文字幕一区二区三区有限公司| 久久精品国产精品亚洲人人 | 黄色欧美网站| 国产欧美另类第一页| 特级一级毛片视频免费观看| 你懂的网站在线观看网址| 成人99国产精品一级毛片| 免费看又爽又黄禁片视频1000| 欧美另类高清| 一级做a爱过程免费视| 浮荡视频在线观看免费| 四虎网址| 搞逼综合网| 久久国产乱子伦精品免费午夜| 亚洲成人精品|