基于Qt5的MODBUS協(xié)議編程與實現(xiàn)_第1頁
基于Qt5的MODBUS協(xié)議編程與實現(xiàn)_第2頁
基于Qt5的MODBUS協(xié)議編程與實現(xiàn)_第3頁
基于Qt5的MODBUS協(xié)議編程與實現(xiàn)_第4頁
基于Qt5的MODBUS協(xié)議編程與實現(xiàn)_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、基于Qt5的MODBUS協(xié)議編程與實現(xiàn) 摘 要:上位機軟件編寫在嵌入式系統(tǒng)開發(fā)中是很重要的一環(huán),一直得到嵌入式工程師的廣泛關(guān)注。文中介紹了采用最新Qt5庫的串口模塊解碼MODBUS數(shù)據(jù)包的實現(xiàn)方案,詳細闡述了Qt5的串口編程接口,和用有限狀態(tài)機進行數(shù)據(jù)解碼的實現(xiàn)方法,實踐證明該方法編程簡單、工作穩(wěn)定可靠。 關(guān)鍵詞:QT;串口通信;有限狀態(tài)機;MODBUS 中圖分類號: TP311.11 文獻標(biāo)識碼: A 文章編號: 1673-1069(2016)11-138-2 0 引言 在“智能電子線路故障診斷實訓(xùn)裝置”研制過程中,需要開發(fā)一款上位機控制軟件,在一般的嵌入式應(yīng)用開發(fā)中,也總是會遇到各種上位機

2、軟件編寫的任務(wù),上位機軟件編寫的核心任務(wù)之一是串口通信。傳統(tǒng)的上位機軟件開發(fā)工具是VB6、VC+一類工具,但VB6過于陳舊不能較好支持微軟新的操作系統(tǒng),VC+又因為MFC的復(fù)雜而很難被嵌入式開發(fā)工程師掌握。因此本文將介紹采用Qt5的串口編程方法,既能輕松掌握,又功能強大。 1 Qt5的串口通信 Qt是一個跨平臺的C+和GUI開發(fā)框架,是一個模塊化的C+類庫,與Visual C+使用的MFC類庫相比,Qt簡單方便、功能完善、跨平臺、擴展能力強,可以用于嵌入式開發(fā)。使用Qt編程的核心優(yōu)勢在于優(yōu)美的信號槽機制和強大易用的開發(fā)工具Qt Creator。Qt目前最新版本為Qt 5。Qt 5中用于串口通信

3、編程的模塊是類QSerialPort和類QSerialPortInfo。 1.1 串口的枚舉 調(diào)用靜態(tài)方法QSerialPortInfo:availablePorts()可以枚舉系統(tǒng)中所有的串口,得到系統(tǒng)中可用串口的QSerialPortInfo對象列表,通過QSerialPortInfo類可以獲取串口的有關(guān)信息,常用的有方法isBusy()可用于判斷串口是否處于忙碌狀態(tài),方法portName()可用于獲取串口的名稱,也可將QSerialPortInfo對象作為輸入?yún)?shù)調(diào)用QSerialPort對象的setPort()或setPortName()方法,設(shè)置想要操作的串口設(shè)備。 1.2 串口的初

4、始設(shè)置 與在嵌入式設(shè)備上的串口開發(fā)一致,上位機中串口通信的第一步也是選擇串口并對通信參數(shù)進行設(shè)置。Qt 5中,用QSerialPort對象來抽象串口端口,封裝串口有關(guān)的操作。構(gòu)造一個QSerialPort對象后,通過setPort()或setPortName()方法選擇想要操作的串口設(shè)備,然后使用open()方法打開該端口,當(dāng)打開成功后,QSerialPort會嘗試檢測串口的當(dāng)前配置,并用作為自己的初始設(shè)置,也可使用setBaudRate(), setDataBits(), setParity(), setStopBits(), and setFlowControl()方法來重新設(shè)置波特率、數(shù)

5、據(jù)幀格式、流控模式等通信參數(shù)。將串口設(shè)置為19200波特率、8N1數(shù)據(jù)幀。 1.3 串口數(shù)據(jù)的讀寫 串口通信的核心在于數(shù)據(jù)的收發(fā),借助于強大的QSerialPort類,只需要使用簡單的read()或write()方法,就可以讀和寫串口了。也可使用readLine()、readAll()讀取串口接收到的數(shù)據(jù),如果沒有一次性讀取完所有收到的數(shù)據(jù),剩余的數(shù)據(jù)會存放在QSerialPort的內(nèi)部數(shù)據(jù)緩存區(qū)中,新接收到的數(shù)據(jù)會附加到數(shù)據(jù)緩沖區(qū)的尾部??梢允褂胹etReadBufferSize()方法限制內(nèi)部讀緩沖區(qū)的大小。串口數(shù)據(jù)讀取的另一個關(guān)鍵是讀取的時機的選擇,這通常有兩種選擇,一是用一個循環(huán)不斷的

6、讀取串口直到接收到所有需要的數(shù)據(jù),但這會阻塞掉其他任務(wù),一般只用于非GUI的應(yīng)用;另一種選擇是使用Qt強大的信號槽機制,連接QSerialPort的readyRead()信號到自己的串口數(shù)據(jù)讀取槽函數(shù),這樣串口一旦接收到數(shù)據(jù),槽函數(shù)就會被調(diào)用,在這里可以編寫串口接收數(shù)據(jù)的處理代碼,可以在該函數(shù)中,將收到的數(shù)據(jù)存入一個數(shù)據(jù)隊列,方便后續(xù)對數(shù)據(jù)的解包操作,可參考如下代碼。 void serialRead() QByteArray bytes; while(!serial->atEnd() bytes += serial->read(300); for(int i = 0; i <

7、 bytes.count(); +i) dataBuffer.push_back(bytesi); parseSerialData(); 1.4 關(guān)閉串口 串口操作完成后,需要使用close()方法,關(guān)閉串口停止I/O操作。 2 MODBUS協(xié)議的實現(xiàn) 要實現(xiàn)可靠的串口通信,還需要一個可靠的串口通信協(xié)議,MODBUS協(xié)議在工業(yè)界已經(jīng)得到廣泛的運用,下文就簡要介紹一下MODBUS協(xié)議在Qt串口通信中的實現(xiàn)。 2.1 MODBUS簡介 Modbus協(xié)議是應(yīng)用于電子控制器上的一種通用語言。通過此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))和其它設(shè)備之間可以通信。它已經(jīng)成為一通用工業(yè)標(biāo)準(zhǔn)。有了它

8、,不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進行集中監(jiān)控。此協(xié)議定義了一個控制器能認識使用的消息結(jié)構(gòu),而不管它們是經(jīng)過何種網(wǎng)絡(luò)進行通信的。它描述了一控制器請求訪問其它設(shè)備的過程,如何回應(yīng)來自其它設(shè)備的請求,以及怎樣偵測錯誤并記錄。它制定了消息域格局和內(nèi)容的公共格式。 2.2 MODBUS的消息幀 MODBUS的通用消息幀分為ASCII消息幀和RTU消息幀,其中ASCII消息幀采用LRC縱向冗余校驗,RTU消息幀采用CRC循環(huán)冗余校驗。消息幀的結(jié)構(gòu)如圖1所示。 2.3 采用狀態(tài)機方式解碼MODBUS RTU消息幀 實現(xiàn)MODUBS協(xié)議的關(guān)鍵在于解碼MODBUS 消息幀,考慮到串口通信中可能出現(xiàn)的各種傳輸錯誤,可靠的解碼消息幀的方法是使用狀態(tài)機編程模型。根據(jù)消息幀的結(jié)構(gòu)可以設(shè)計如下的狀態(tài)轉(zhuǎn)換圖進行數(shù)據(jù)的解碼操作。(如圖2) 解包程序首先進入起始狀態(tài)等待消息頭,每收到一部分數(shù)據(jù)就進入相應(yīng)的下一個功能狀態(tài),接收過程中遇到任何錯誤,都簡單的丟棄掉所有已經(jīng)接收到的數(shù)據(jù),重新等待下一個消息幀。 3 結(jié)語 本文介紹了使用Qt5 中串口通信模塊用于MODBUS協(xié)議解包的實現(xiàn)方法,該設(shè)計方案已成功用于某課題的電子線路自動故障測試儀的上位機軟件開發(fā)中,數(shù)據(jù)收發(fā)可靠、穩(wěn)定,較好地滿足了功能需求

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論