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

?

基于Qt5的MODBUS協(xié)議編程與實現(xiàn)

2016-05-23 23:01李曉鋒胡良君
關(guā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 文獻標識碼: A 文章編號: 1673-1069(2016)11-138-2

0 引言

在“智能電子線路故障診斷實訓裝置”研制過程中,需要開發(fā)一款上位機控制軟件,在一般的嵌入式應用開發(fā)中,也總是會遇到各種上位機軟件編寫的任務,上位機軟件編寫的核心任務之一是串口通信。傳統(tǒng)的上位機軟件開發(fā)工具是VB6、VC++一類工具,但VB6過于陳舊不能較好支持微軟新的操作系統(tǒng),VC++又因為MFC的復雜而很難被嵌入式開發(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中用于串口通信編程的模塊是類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()方法,設置想要操作的串口設備。

1.2 串口的初始設置

與在嵌入式設備上的串口開發(fā)一致,上位機中串口通信的第一步也是選擇串口并對通信參數(shù)進行設置。Qt 5中,用QSerialPort對象來抽象串口端口,封裝串口有關(guān)的操作。構(gòu)造一個QSerialPort對象后,通過setPort()或setPortName()方法選擇想要操作的串口設備,然后使用open()方法打開該端口,當打開成功后,QSerialPort會嘗試檢測串口的當前配置,并用作為自己的初始設置,也可使用setBaudRate(), setDataBits(), setParity(), setStopBits(), and setFlowControl()方法來重新設置波特率、數(shù)據(jù)幀格式、流控模式等通信參數(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)不斷的讀取串口直到接收到所有需要的數(shù)據(jù),但這會阻塞掉其他任務,一般只用于非GUI的應用;另一種選擇是使用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 < bytes.count(); ++i)

dataBuffer.push_back(bytes[i]);

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é)議是應用于電子控制器上的一種通用語言。通過此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(例如以太網(wǎng))和其它設備之間可以通信。它已經(jīng)成為一通用工業(yè)標準。有了它,不同廠商生產(chǎn)的控制設備可以連成工業(yè)網(wǎng)絡,進行集中監(jiān)控。此協(xié)議定義了一個控制器能認識使用的消息結(jié)構(gòu),而不管它們是經(jīng)過何種網(wǎng)絡進行通信的。它描述了一控制器請求訪問其它設備的過程,如何回應來自其它設備的請求,以及怎樣偵測錯誤并記錄。它制定了消息域格局和內(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)可以設計如下的狀態(tài)轉(zhuǎn)換圖進行數(shù)據(jù)的解碼操作。(如圖2)

解包程序首先進入起始狀態(tài)等待消息頭,每收到一部分數(shù)據(jù)就進入相應的下一個功能狀態(tài),接收過程中遇到任何錯誤,都簡單的丟棄掉所有已經(jīng)接收到的數(shù)據(jù),重新等待下一個消息幀。

3 結(jié)語

本文介紹了使用Qt5 中串口通信模塊用于MODBUS協(xié)議解包的實現(xiàn)方法,該設計方案已成功用于某課題的電子線路自動故障測試儀的上位機軟件開發(fā)中,數(shù)據(jù)收發(fā)可靠、穩(wěn)定,較好地滿足了功能需求。

參 考 文 獻

[1] 霍亞飛.Qt Creator快速入門(第2版)[M].北京:北京航空航天大學出版社,2014.

[2] 李曉鋒.AVR單片機原理與應用[M].北京:北京理工大學出版社,2010.

[3] 李曉鋒,宋銳.有限狀態(tài)機在嵌入式系統(tǒng)中的實現(xiàn)及應用[J].廣西輕工業(yè),2008-04.

猜你喜歡
串口通信
基于Qt和Flash的嵌入式Linux軟件架構(gòu)設計
基于Python實現(xiàn)設備控制臺的集中控制和管理
基于MSP430單片機的窄帶無線數(shù)據(jù)傳輸模塊的設計
便攜式數(shù)傳電臺測試系統(tǒng)的設計與實現(xiàn)
基于MFC的AUV多傳感器數(shù)據(jù)采集系統(tǒng)設計及測試
基于LabVIEW的溫度測量系統(tǒng)設計
基于FPGA和ARM的實時數(shù)據(jù)采集顯示系統(tǒng)