• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

      2016-05-23 23:01李曉鋒胡良君
      關(guā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ī)軟件編寫的任務(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中用于串口通信編程的模塊是類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 串口的初始設(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ù)據(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)不斷的讀取串口直到接收到所有需要的數(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 < bytes.count(); ++i)

      dataBuffer.push_back(bytes[i]);

      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)。有了它,不同廠商生產(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)定,較好地滿足了功能需求。

      參 考 文 獻(xiàn)

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

      [2] 李曉鋒.AVR單片機(jī)原理與應(yīng)用[M].北京:北京理工大學(xué)出版社,2010.

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

      猜你喜歡
      串口通信
      基于Qt和Flash的嵌入式Linux軟件架構(gòu)設(shè)計(jì)
      基于Python實(shí)現(xiàn)設(shè)備控制臺(tái)的集中控制和管理
      基于MSP430單片機(jī)的窄帶無線數(shù)據(jù)傳輸模塊的設(shè)計(jì)
      便攜式數(shù)傳電臺(tái)測(cè)試系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
      基于MFC的AUV多傳感器數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)及測(cè)試
      基于LabVIEW的溫度測(cè)量系統(tǒng)設(shè)計(jì)
      基于FPGA和ARM的實(shí)時(shí)數(shù)據(jù)采集顯示系統(tǒng)
      建始县| 盐边县| 通化市| 宜昌市| 车险| 黄冈市| 兴义市| 蒙阴县| 潞西市| 邹城市| 太保市| 武宣县| 潼南县| 万州区| 比如县| 湖北省| 岑巩县| 华阴市| 阿坝县| 麻栗坡县| 墨竹工卡县| 吉木萨尔县| 南昌市| 克拉玛依市| 东源县| 襄汾县| 双城市| 桐梓县| 杨浦区| 常宁市| 岳西县| 汉川市| 岳阳县| 板桥市| 赣州市| 阜新市| 和田市| 大安市| 青龙| 定日县| 民乐县|