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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

4、始設(shè)置 與在嵌入式設(shè)備上的串口開發(fā)一致,上位機(jī)中串口通信的第一步也是選擇串口并對(duì)通信參數(shù)進(jìn)行設(shè)置。Qt 5中,用QSerialPort對(duì)象來抽象串口端口,封裝串口有關(guān)的操作。構(gòu)造一個(gè)QSerialPort對(duì)象后,通過setPort()或setPortName()方法選擇想要操作的串口設(shè)備,然后使用open()方法打開該端口,當(dāng)打開成功后,QSerialPort會(huì)嘗試檢測(cè)串口的當(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ā),借助于強(qiáng)大的QSerialPort類,只需要使用簡(jiǎn)單的read()或write()方法,就可以讀和寫串口了。也可使用readLine()、readAll()讀取串口接收到的數(shù)據(jù),如果沒有一次性讀取完所有收到的數(shù)據(jù),剩余的數(shù)據(jù)會(huì)存放在QSerialPort的內(nèi)部數(shù)據(jù)緩存區(qū)中,新接收到的數(shù)據(jù)會(huì)附加到數(shù)據(jù)緩沖區(qū)的尾部??梢允褂胹etReadBufferSize()方法限制內(nèi)部讀緩沖區(qū)的大小。串口數(shù)據(jù)讀取的另一個(gè)關(guān)鍵是讀取的時(shí)機(jī)的選擇,這通常有兩種選擇,一是用一個(gè)循環(huán)不斷的

6、讀取串口直到接收到所有需要的數(shù)據(jù),但這會(huì)阻塞掉其他任務(wù),一般只用于非GUI的應(yīng)用;另一種選擇是使用Qt強(qiáng)大的信號(hào)槽機(jī)制,連接QSerialPort的readyRead()信號(hào)到自己的串口數(shù)據(jù)讀取槽函數(shù),這樣串口一旦接收到數(shù)據(jù),槽函數(shù)就會(huì)被調(diào)用,在這里可以編寫串口接收數(shù)據(jù)的處理代碼,可以在該函數(shù)中,將收到的數(shù)據(jù)存入一個(gè)數(shù)據(jù)隊(duì)列,方便后續(xù)對(duì)數(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é)議的實(shí)現(xiàn) 要實(shí)現(xiàn)可靠的串口通信,還需要一個(gè)可靠的串口通信協(xié)議,MODBUS協(xié)議在工業(yè)界已經(jīng)得到廣泛的運(yùn)用,下文就簡(jiǎn)要介紹一下MODBUS協(xié)議在Qt串口通信中的實(shí)現(xiàn)。 2.1 MODBUS簡(jiǎn)介 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ò),進(jìn)行集中監(jiān)控。此協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),而不管它們是經(jīng)過何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了一控制器請(qǐng)求訪問其它設(shè)備的過程,如何回應(yīng)來自其它設(shè)備的請(qǐng)求,以及怎樣偵測(cè)錯(cuò)誤并記錄。它制定了消息域格局和內(nèi)容的公共格式。 2.2 MODBUS的消息幀 MODBUS的通用消息幀分為ASCII消息幀和RTU消息幀,其中ASCII消息幀采用LRC縱向冗余校驗(yàn),RTU消息幀采用CRC循環(huán)冗余校驗(yàn)。消息幀的結(jié)構(gòu)如圖1所示。 2.3 采用狀態(tài)機(jī)方式解碼MODBUS RTU消息幀 實(shí)現(xiàn)MODUBS協(xié)議的關(guān)鍵在于解碼MODBUS 消息幀,考慮到串口通信中可能出現(xiàn)的各種傳輸錯(cuò)誤,可靠的解碼消息幀的方法是使用狀態(tài)機(jī)編程模型。根據(jù)消息幀的結(jié)構(gòu)可以設(shè)計(jì)如下的狀態(tài)轉(zhuǎn)換圖進(jìn)行數(shù)據(jù)的解碼操作。(如圖2) 解包程序首先進(jìn)入起始狀態(tài)等待消息頭,每收到一部分?jǐn)?shù)據(jù)就進(jìn)入相應(yīng)的下一個(gè)功能狀態(tài),接收過程中遇到任何錯(cuò)誤,都簡(jiǎn)單的丟棄掉所有已經(jīng)接收到的數(shù)據(jù),重新等待下一個(gè)消息幀。 3 結(jié)語 本文介紹了使用Qt5 中串口通信模塊用于MODBUS協(xié)議解包的實(shí)現(xiàn)方法,該設(shè)計(jì)方案已成功用于某課題的電子線路自動(dòng)故障測(cè)試儀的上位機(jī)軟件開發(fā)中,數(shù)據(jù)收發(fā)可靠、穩(wěn)定,較好地滿足了功能需求

溫馨提示

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

評(píng)論

0/150

提交評(píng)論