国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種使用Qt的姿態(tài)傳感器顯控設(shè)計與實現(xiàn)

2019-07-26 03:26王瀟盧如意李博
聲學(xué)與電子工程 2019年2期
關(guān)鍵詞:控件串口數(shù)據(jù)包

王瀟 盧如意 李博

(第七一五研究所,杭州,310023)

姿態(tài)傳感器顯控軟件是連接計算機終端與傳感器的橋梁,其將控制指令發(fā)送給傳感器并使計算機終端接收到測量數(shù)據(jù),使整個測量系統(tǒng)構(gòu)成回路。以傳統(tǒng)的MFC(Microsoft Foundation Classes)方法開發(fā)復(fù)雜的圖形界面,需要程序員編寫大量的代碼,對控件的實現(xiàn)需要調(diào)用底層的作圖函數(shù)進行繪制,開發(fā)時間長。而Qt具有跨平臺性能[1],可以一次編寫多處編譯,具有良好的封裝機制、友好的信號-槽連接事件驅(qū)動機制,并提供Qt Designer圖形界面開發(fā)工具[2],可進行拖拽式的界面控件排布,便于程序開發(fā)。本文介紹了一種使用 Qt的姿態(tài)傳感器顯控軟件設(shè)計方法,以較小的代碼量以及較短的開發(fā)周期實現(xiàn)了計算機終端與姿態(tài)傳感器的控制指令及測量信息的交互,以及測量數(shù)據(jù)實時顯示保存的功能需求。

1 姿態(tài)傳感器概述

本文所使用的姿態(tài)傳感器通過 RS485串口與外部設(shè)備通信,可同時上傳偏航角、俯仰角、橫滾角以及溫度數(shù)據(jù),將其封裝在一個15 Byte數(shù)據(jù)包中。測量數(shù)據(jù)通信協(xié)議如表1所示。

表1 姿態(tài)傳感器測量數(shù)據(jù)通信協(xié)議

若干個姿態(tài)傳感器由下位單片機串聯(lián)在RS485通信總線上,共用一個串口與顯控終端通信,通過姿態(tài)傳感器的通信地址尋址通信,即可同時測量一個陣列中各節(jié)點處的姿態(tài)數(shù)據(jù),上傳的測量數(shù)據(jù)即為若干個15 Byte數(shù)據(jù)包的拼接,非傳感器通信地址的命令幀將不予響應(yīng)。顯控軟件在打開串口建立串口通信后即發(fā)送開始測量指令,串聯(lián)在一起的若干個傳感器即可按照給定的頻率上傳測量結(jié)果數(shù)據(jù)。顯控軟件解析數(shù)據(jù)包,可得到連接的傳感器數(shù)量并顯示測量結(jié)果數(shù)據(jù)與圖線。

2 軟件架構(gòu)

姿態(tài)傳感器顯控軟件根據(jù)功能組成劃分為串口通信模塊、圖形顯示模塊與數(shù)據(jù)存儲模塊,如圖1所示。

圖1 姿態(tài)傳感器顯控軟件架構(gòu)圖

串口通信模塊使控制指令及測量結(jié)果根據(jù)相關(guān)通信協(xié)議進行封包或解析[3],并以數(shù)據(jù)幀的形式進行上傳與下發(fā)。該模塊使用Qt封裝的QSerialPort串口控件[4],其提供主要接口函數(shù)如表2所示。

表2 QSerialPort控件接口函數(shù)

圖形顯示模塊將從串口獲取的測量數(shù)據(jù)顯示在界面中并繪制成圖線。該模塊使用 Qt提供的QGraphicsView 控件[5],其依靠 QGraphicsView-QGraphicsScene-QGraphicsItem的三級機制繪圖:View為“畫板”,Scene為“畫布”,Item即為繪制在“畫布”上的圖形。圖形顯示區(qū)域采用 QMdiWidget的多子窗口顯示機制,由測量數(shù)據(jù)包解析結(jié)果獲取傳感器數(shù)量并生成對應(yīng)數(shù)量的子窗口,可采用平鋪(tile)或?qū)盈B(cascade)的方式同時顯示所有子窗口,或者以選項卡的形式最大化某一子窗口。這部分內(nèi)容將在第3節(jié)介紹。

數(shù)據(jù)存儲模塊將測量數(shù)據(jù)實時存儲到本地的CSV 文件中[6]。該模塊封裝了 Qt的 QFile類與QTextStream類,以實現(xiàn)數(shù)據(jù)文件的存儲。

軟件的UML類圖如2所示。圖形顯示模塊由PaintArea類構(gòu)成,其為繼承自QGraphicsView的子類,嵌入在MesFigDisArea類中,它的類對象作為后者成員變量,一起構(gòu)成測量數(shù)據(jù)及圖線的顯示控件。DMCCom_Array類為主界面類,其包含了串口通信模塊與數(shù)據(jù)存儲模塊,由一個QList裝入若干MesFigDisArea類對象,可同時顯示多個傳感器的測量結(jié)果。

圖2 姿態(tài)傳感器顯控軟件UML類圖

軟件運行流程如圖3所示。在以給定參數(shù)配置打開串口之后,與下位機建立通信并發(fā)送上數(shù)指令,在狀態(tài)欄顯示串口狀態(tài)。在接收到下位機第一次上傳的數(shù)據(jù)包之后進行解析。首先,如果數(shù)據(jù)包長度為單個傳感器數(shù)據(jù)包長度整數(shù)倍,則判斷為正確數(shù)據(jù)包,不符合條件的直接剔除。對于正確數(shù)據(jù)包,遍歷數(shù)據(jù)包的每一個字節(jié)尋找0xAA、0x55的幀頭,檢測幀頭后第4個字節(jié)的指令位是否為0x31的反饋標(biāo)識判斷是否為有效數(shù)據(jù)包,剔除不符合反饋標(biāo)識的數(shù)據(jù)包;對于有效數(shù)據(jù)包,計算幀頭后續(xù)第4~13個字節(jié)的檢驗和判斷是否為正確數(shù)據(jù)包。對于每個幀段都滿足以上條件的正確數(shù)據(jù)包,根據(jù)幀頭數(shù)量得到下位機所串聯(lián)的傳感器數(shù)量,據(jù)此初始化出相應(yīng)數(shù)量的子窗口,默認(rèn)以平鋪的方式顯示在主界面的多窗口顯示區(qū)域中,并更新傳感器列表及狀態(tài)欄中的傳感器數(shù)量。此后,根據(jù)通信協(xié)議給定的字節(jié)順序以及分辨率解析每個幀段的數(shù)據(jù)位,得到各項測量數(shù)據(jù)并在界面中顯示、保存。對于下位機后續(xù)上傳的數(shù)據(jù)包,同樣根據(jù)以上方法判斷數(shù)據(jù)包的正確性,剔除錯誤數(shù)據(jù)包,解析出正確數(shù)據(jù)包的測量值,并在界面中更新顯示。軟件會記錄持續(xù)測量時間以及測量數(shù)據(jù)上傳次數(shù)并在界面中顯示。

圖3 姿態(tài)傳感器顯控軟件流程圖

3 軟件界面設(shè)計

軟件主圖形界面見圖 4,左側(cè)區(qū)域用作串口參數(shù)設(shè)置及操作、測量計數(shù)顯示、傳感器列表顯示以及測量結(jié)果存儲操作。其中,以一個 QListWidget控件顯示由數(shù)據(jù)包解析到的傳感器列表,并與右側(cè)測量結(jié)果顯示區(qū)域聯(lián)動。主界面右側(cè)以一個QMdiWidget控件顯示測量結(jié)果。主界面下方狀態(tài)欄可顯示當(dāng)前串口狀態(tài)以及檢測到的傳感器數(shù)量。

偏航角、俯仰角、橫滾角與溫度測量值顯示子窗口界面如圖5所示。界面上方顯示4個測量數(shù)值,右側(cè)以4個QGraphicsView小控件顯示曲線對應(yīng)的顏色圖例。下方的白色區(qū)域為顯示曲線圖的QGraphicsView控件。每個傳感器均獨立地以一個子窗口顯示測量值及圖線。

圖4 姿態(tài)傳感器顯控軟件主界面

圖5 測量值顯示子窗口

4 軟件功能實現(xiàn)

建立串口通信后,顯控軟件向姿態(tài)傳感器發(fā)送“開始測量“指令,使之以應(yīng)答模式或者廣播模式工作。顯控軟件收到傳感器通過串口上傳的測量數(shù)據(jù)包,按照通信協(xié)議進行解析,解算出偏航角、俯仰角、橫滾角與溫度,獲取當(dāng)前時間后在相應(yīng)控件中顯示并保存到本地文件。同時,顯控軟件將偏航角、俯仰角、橫滾角與溫度換算為 QGraphicsView的場景中的坐標(biāo)值并繪制出曲線圖。

4.1 指令發(fā)送與數(shù)據(jù)包解析

使用QSerialPort串口控件類,需要注意的是在調(diào)用 open()函數(shù)打開類對象的串口時須使用COMMTIMEOUTS結(jié)構(gòu)體對象來設(shè)置串口類對象的超時。在設(shè)置完串口波特率、數(shù)據(jù)位等參數(shù)并設(shè)置好超時后即在計算機與傳感器之間建立了串口通信。

控制指令同樣以數(shù)據(jù)幀的形式發(fā)送,使用一個QByteArray類對象,以 append()函數(shù)依次壓入 16進制的指令字節(jié),然后將 QByteArray類對象作為串口類對象write()函數(shù)的實參調(diào)用即可發(fā)送控制指令給傳感器。

串口接收到數(shù)據(jù)后,將會觸發(fā)QSerialPort串口類對象的readyRead()信號函數(shù)?;赒t的信號-槽事件驅(qū)動體制,將readyRead()信號與用于讀取數(shù)據(jù)的自定義槽函數(shù)通過connect()函數(shù)連接即可使顯控軟件做出讀取到串口數(shù)據(jù)后的響應(yīng)動作。在自定義槽函數(shù)中,通過串口類對象的readAll()將從串口獲取的字節(jié)數(shù)組賦給QByteArray類對象,使用一個8位無符號整型數(shù)據(jù)作為元素的 QList容器存入QByteArray類對象中的各個字節(jié)以便進行后續(xù)的解析工作[7]。

將反饋數(shù)據(jù)包存入 QList容器后,以容器的size()函數(shù)判斷數(shù)據(jù)包的長度,其值應(yīng)為單個傳感器反饋的測量結(jié)果數(shù)據(jù)包長度的整數(shù)倍,即 15 Byte的整數(shù)倍,若不滿足該條件則認(rèn)為數(shù)據(jù)錯誤并剔除。反之,將QList容器作為實參傳入數(shù)據(jù)包解析函數(shù),查看每個15 Byte幀段的首兩個字節(jié)是否為0xAA 0x55的雙字節(jié)數(shù)據(jù)包幀頭、每個幀段的第 5 Byte是否為 0x31的反饋標(biāo)識、計算每個幀段第 4~13 Byte的檢驗和與第14 Byte是否吻合來檢驗數(shù)據(jù)包的正確性。同時滿足以上三個條件方為正確的測量結(jié)果幀段。剔除錯誤數(shù)據(jù)包,對于正確結(jié)果將第6~13 Byte的偏航角、俯仰角、橫滾角與溫度數(shù)據(jù)以高字節(jié)在前、低字節(jié)在后的順序換算為 10進制的整型數(shù)據(jù),再乘以給定的分辨率得到相應(yīng)的測量值。以一個QList容器依次裝入4個測量值,再以一個 QList>容器裝入各傳感器的測量結(jié)果返回。在第一次得到測量數(shù)據(jù)包時,通過QList>容器的元素個數(shù)即可獲取當(dāng)前串聯(lián)的傳感器個數(shù),據(jù)此初始化出相應(yīng)數(shù)量的子窗口進行顯示。

4.2 測量結(jié)果數(shù)據(jù)曲線繪制

在收到測量數(shù)據(jù)包并解析之后,從QList>容器中獲取各傳感器的偏航角、俯仰角、橫滾角與溫度測量結(jié)果顯示在相應(yīng)區(qū)域。同時,程序以2個像素為測量數(shù)值曲線的顯示寬度,根據(jù)數(shù)值的測量時序給每個測量點賦予在曲線圖中顯示的橫坐標(biāo)值;再將測量值換算為在QGraphicsScene場景中的縱坐標(biāo)值,即可將一組測量值轉(zhuǎn)換為QGraphicsScene中的QGraphicsItem,調(diào)用QGraphicsScene的addItem()函數(shù),即可將測量點Item繪制在場景中。以前后兩組測量點為端點,可繪制一個線段Item于兩個測量點之間。據(jù)此,即可實現(xiàn)測量結(jié)果圖線的繪制。同時,重載QGraphicsView的resizeEvent()與wheelEvent()虛函數(shù)[8],可實現(xiàn)圖線隨著窗口大小自動調(diào)整顯示比例以及縮放。

圖6 測量結(jié)果顯示

從下位機接收到正確數(shù)據(jù)包并解析數(shù)據(jù)后,以獨立子窗口顯示各傳感器測量結(jié)果如圖6所示。對于需要重點關(guān)注的傳感器,可將該子窗口以選項卡的形式最大化顯示。

4.3 測量結(jié)果數(shù)據(jù)保存

在顯示并繪制測量值及圖線的同時,數(shù)據(jù)存儲模塊將測量結(jié)果以CSV文件的格式保存在彈出對話框選定的路徑中。存儲模塊以QFile類對象建立CSV文件,以QTextStream類對象將測量結(jié)果以文本流的形式輸出到目標(biāo)文件中。CSV文件本質(zhì)上是以逗號分隔的TXT文本文件,在以文本流輸出一個測量值后跟著輸出一個逗號,即可實現(xiàn)以表格形式存儲測量數(shù)據(jù)。在初次存儲數(shù)據(jù)時,首先建立CSV文件,輸出包含上數(shù)時間以及各測量項的表頭,后續(xù)每次保存都按照給定順序輸出即可。軟件可以手動保存或者設(shè)定時間間隔以定時器進行自動保存。測量結(jié)果文件見表3。

表3 測量結(jié)果CSV文件

5 結(jié)論

本文提出的基于 Qt的姿態(tài)傳感器顯控軟件設(shè)計思路,靈活調(diào)用 Qt圖形界面庫中高度集成、成熟的串口通信控件與二維圖形繪制控件,在一定程度上減輕了軟件編制難度,以較小的代碼量以及較短的開發(fā)周期實現(xiàn)了計算機終端與姿態(tài)傳感器的控制指令及測量信息的交互以及測量數(shù)據(jù)實時顯示、保存的功能需求。

猜你喜歡
控件串口數(shù)據(jù)包
二維隱蔽時間信道構(gòu)建的研究*
淺談AB PLC串口跟RFID傳感器的通訊應(yīng)用
民用飛機飛行模擬機數(shù)據(jù)包試飛任務(wù)優(yōu)化結(jié)合方法研究
基于.net的用戶定義驗證控件的應(yīng)用分析
C#串口高效可靠的接收方案設(shè)計
關(guān)于.net控件數(shù)組的探討
數(shù)字電源內(nèi)部數(shù)據(jù)傳輸?shù)拇谕ㄐ欧椒▽崿F(xiàn)
USB接口的多串口數(shù)據(jù)并行接收方法探索
串口技術(shù)的實物調(diào)試和虛擬仿真聯(lián)合教學(xué)模式
基于嵌入式MINIGUI控件子類化技術(shù)的深入研究與應(yīng)用
无为县| 安吉县| 房山区| 五寨县| 宜昌市| 额济纳旗| 张家川| 文安县| 中西区| 吉林市| 文山县| 揭东县| 定兴县| 潮安县| 探索| 如皋市| 富源县| 报价| 仁怀市| 阜康市| 昌吉市| 曲阳县| 皮山县| 武宣县| 万年县| 垣曲县| 瑞丽市| 杭锦旗| 蒲江县| 延吉市| 敖汉旗| 梁平县| 龙江县| 民勤县| 潢川县| 商都县| 丹江口市| 五家渠市| 纳雍县| 阳朔县| 永新县|