基於ZigBee和STM32的智能家居控制系統的設計與實現(三)


基於ZigBee和STM32的智能家居控制系統的設計與實現(三)

自從前兩篇博客介紹了智能家居系統的基本實現機理后,收到了好多朋友的來信,和我討論了好多的這方面的知識,在此很高興,雖然自己做的這個所謂的智能家居看着挺高大上的,其實沒有什么了,在內行人眼里都是小兒科。所以如果你是高手,請繞步。對於想要學習這方面知識的小伙伴來說還是有其價值的。


這篇博客就來說說界面的問題吧

界面的實現

打開下位機系統第一版,發現它是這個樣子的,才想起來自己當時只是想在PC機上跑跑而已,而如今已經跑在了ARM板上。
這里寫圖片描述


最終版本的界面如下圖所示:
這里寫圖片描述

最初設計的時候界面我全部是使用控件拖出來的,這樣開發很快,但是也有弊端。
這里寫圖片描述

怎么樣,界面很朴素吧,剩下的工作全部交給QSS就可以了。
在上圖中,4個按鈕都是ToolButton,然后設置對應的Icon就行了,因為QToolButton能夠設置文本和圖標,所以選擇了ToolButton,這樣就可以設置文本顯示在圖標的下邊了。

    tbn->setAutoRaise(true); //設置文本在圖標下邊 tbn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
  • 1
  • 2
  • 3

界面中的其他圖標設置樣式都是類似的,只不過是大小策略的不同而已,關於界面實現的細節,通過修改樣式表完全可以解決,樣式表我就不做過多的介紹,因為官方的文檔介紹的太詳細了。
http://doc.qt.io/qt-4.8/stylesheet-examples.html

這里寫圖片描述


數據通信介紹

簡述

從題目中可以看出使用的是zigbee進行通信的,但是,仔細一想,通信的接口到頭來還是串口,因此上位機通信編程其實就是串口編程了,說到串口,Qt5已經給我們封裝好了類,只需在工程配置文件中添加QT += serialport就可以直接進行調用相關類了。


到了Qt4里面是沒有這個類的。由於Qt4中沒有串口類,只要5里邊有,因此很多時候是直接使用的第三串口方庫,直接將它添加到我們自己的工程當中來使用的,出於方便,也可以直接使用Qt4自帶的qmake將庫編譯到Qt4庫當中,以后想用的話直接使用就可以了。使用的時候需要在.pro文件中包含進來:
這里寫圖片描述

編譯第三方串口類

可以直接下載Qt 5的串口部分源碼,注意是串口部分的源碼,當然你也可以全部下載,那樣就比較耗時,Qt很友好的給我們提供了模塊下載,這真的是非常好的。
下載地址:
串口源碼下載(http://download.qt.io/archive/qt/5.1/5.1.1/submodules/

打開后會發現設計到串口相關的有4個壓縮包,在window下的話就直接下載第一個(紅色圈起來的部分),當然也可以下載第二個也行了。這份源碼可以在不同平台進行編譯一次,這樣你的代碼移植性就比較好。這里只介紹在windows下的編譯,其他平台的編譯方法類似。

這里寫圖片描述

下載源碼后,打開cmd命令窗口(前提是你的qt環境變量已經配置,若沒有配置則直接使用Qt command),進入到串口源碼目錄,執行qmake qtserialport.pro,此時會生成Makefile文件,然后make && make install。會在編譯完成后安裝到Qt的目錄下面。
編譯安裝完成后到Qt4安裝目錄查看,確實有了:
include路徑
這里寫圖片描述

lib路徑:
這里寫圖片描述

這里說明一下為什么要使用Qt5的源碼進行編譯,而不使用第三方串口類。因為Qt5串口類中有個QSerialPortInfo這個類,有了這個可以進行查看當前串口設備信息,這是很方便的,以前使用第三方串口類的時候並沒有發現那樣的放,要想實現列舉當前串口設備,在window下是查看注冊表來是現代,不過這樣不通用,在linux下沒有試過,因此直接編譯了Qt5的串口類。在使用上差不多是一樣的。


通信協議

設計到通信部分,協議肯定是少不了的,工業控制方面目前比較有名的協議有Modbus、BACnet等,其中Modbus是比較有名的。我這里只是簡單的對設備進行了定義,並沒有使用上述復雜的協議。
這里列舉一部分出來
模塊類型宏定義和枚舉
這里寫圖片描述

數據包:
這里寫圖片描述

對一幀數據必須進行區分是發送的命令還是數據,這里做了簡單的區分,實際中可以在添加奇偶校驗位,對數據校驗。要發送出去還必須對數據進行打包處理,完了從我源碼中可以查看,這里就不足過多的介紹了。

數據解析

關於串口通信編程部分,我就不寫了,網上寫的比我詳細多了。其實使用串口編程也很簡單,設置幾個參數再進行判斷即可。在串口打開后數據傳輸都放在了線程里邊進行接收與發送,效率還是可以的,可能我的數據量太小的緣故吧。
數據接收時需要注意的一點就是對開始接收到數據大小進行一個判斷,否則可能造成數據丟失。必須使用bytesAvailable()函數對接收到的數據進行判斷,小於某個數就返回再讀取,否則收到的數據不完整。
這里寫圖片描述


技術在於交流、分享……
Email:kevinlq0912@163.com
QQ:936563422


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM