亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2016-05-23 23:01:56李曉鋒胡良君
        關(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í)踐證明該方法編程簡單、工作穩(wěn)定可靠。

        關(guān)鍵詞:QT;串口通信;有限狀態(tài)機(jī);MODBUS

        中圖分類號: TP311.11 文獻(xiàn)標(biāo)識碼: A 文章編號: 1673-1069(2016)11-138-2

        0 引言

        在“智能電子線路故障診斷實(shí)訓(xùn)裝置”研制過程中,需要開發(fā)一款上位機(jī)控制軟件,在一般的嵌入式應(yīng)用開發(fā)中,也總是會遇到各種上位機(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是一個跨平臺的C++和GUI開發(fā)框架,是一個模塊化的C++類庫,與Visual C++使用的MFC類庫相比,Qt簡單方便、功能完善、跨平臺、擴(kuò)展能力強(qiáng),可以用于嵌入式開發(fā)。使用Qt編程的核心優(yōu)勢在于優(yōu)美的信號槽機(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對象列表,通過QSerialPortInfo類可以獲取串口的有關(guān)信息,常用的有方法isBusy()可用于判斷串口是否處于忙碌狀態(tài),方法portName()可用于獲取串口的名稱,也可將QSerialPortInfo對象作為輸入?yún)?shù)調(diào)用QSerialPort對象的setPort()或setPortName()方法,設(shè)置想要操作的串口設(shè)備。

        1.2 串口的初始設(shè)置

        與在嵌入式設(shè)備上的串口開發(fā)一致,上位機(jī)中串口通信的第一步也是選擇串口并對通信參數(shù)進(jìn)行設(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ù)據(jù)幀格式、流控模式等通信參數(shù)。將串口設(shè)置為19200波特率、8N1數(shù)據(jù)幀。

        1.3 串口數(shù)據(jù)的讀寫

        串口通信的核心在于數(shù)據(jù)的收發(fā),借助于強(qiáng)大的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)鍵是讀取的時機(jī)的選擇,這通常有兩種選擇,一是用一個循環(huán)不斷的讀取串口直到接收到所有需要的數(shù)據(jù),但這會阻塞掉其他任務(wù),一般只用于非GUI的應(yīng)用;另一種選擇是使用Qt強(qiáng)大的信號槽機(jī)制,連接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é)議的實(shí)現(xiàn)

        要實(shí)現(xiàn)可靠的串口通信,還需要一個可靠的串口通信協(xié)議,MODBUS協(xié)議在工業(yè)界已經(jīng)得到廣泛的運(yùn)用,下文就簡要介紹一下MODBUS協(xié)議在Qt串口通信中的實(shí)現(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)。有了它,不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進(jìn)行集中監(jiān)控。此協(xié)議定義了一個控制器能認(rèn)識使用的消息結(jié)構(gòu),而不管它們是經(jīng)過何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了一控制器請求訪問其它設(shè)備的過程,如何回應(yīng)來自其它設(shè)備的請求,以及怎樣偵測錯誤并記錄。它制定了消息域格局和內(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)的各種傳輸錯誤,可靠的解碼消息幀的方法是使用狀態(tài)機(jī)編程模型。根據(jù)消息幀的結(jié)構(gòu)可以設(shè)計如下的狀態(tài)轉(zhuǎn)換圖進(jìn)行數(shù)據(jù)的解碼操作。(如圖2)

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

        3 結(jié)語

        本文介紹了使用Qt5 中串口通信模塊用于MODBUS協(xié)議解包的實(shí)現(xiàn)方法,該設(shè)計方案已成功用于某課題的電子線路自動故障測試儀的上位機(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.

        猜你喜歡
        串口通信
        基于Android的電解質(zhì)分析儀設(shè)計與實(shí)現(xiàn)
        基于Labview的高重頻激光測量方法
        基于Qt和Flash的嵌入式Linux軟件架構(gòu)設(shè)計
        串口通信在智能家居監(jiān)控系統(tǒng)中的應(yīng)用
        基于Python實(shí)現(xiàn)設(shè)備控制臺的集中控制和管理
        基于OpenCV的室內(nèi)照明智能控制系統(tǒng)設(shè)計與實(shí)現(xiàn)
        科技視界(2016年13期)2016-06-13 22:01:19
        基于MSP430單片機(jī)的窄帶無線數(shù)據(jù)傳輸模塊的設(shè)計
        便攜式數(shù)傳電臺測試系統(tǒng)的設(shè)計與實(shí)現(xiàn)
        基于MFC的AUV多傳感器數(shù)據(jù)采集系統(tǒng)設(shè)計及測試
        基于LabVIEW的溫度測量系統(tǒng)設(shè)計
        曰本大码熟中文字幕| 美腿丝袜一区在线观看| 亚洲精品国产成人久久av盗摄| av网站在线观看亚洲国产| 欧美成人午夜免费影院手机在线看| 欧美日韩精品一区二区三区高清视频 | 久久亚洲国产精品五月天| 国产一区二区一级黄色片| 99精品国产一区二区三区| 99久久亚洲精品日本无码| 国产精品久久久久久无码| 五月婷婷影视| 韩国女主播一区二区三区在线观看| 国产精品亚洲精品一区二区| 久久精品国产亚洲av麻豆色欲| 欧美怡红院免费全部视频| 亚洲人成欧美中文字幕 | 日本a在线播放| 日韩亚洲午夜精品一区二区三区| 日本人妻系列中文字幕| 十四以下岁毛片带血a级| 中国内射xxxx6981少妇| 亚洲人成人一区二区三区| 国产成人精品一区二区日出白浆| 亚洲av人片在线观看| 97人妻人人做人碰人人爽| 少妇脱了内裤让我添| 色噜噜狠狠色综合欧洲| 亚洲精品国产av成人网| av一区二区三区在线| 亚洲av午夜国产精品无码中文字| 亚洲国产精品尤物yw在线观看| 国产精品一区二区三密桃| 中文资源在线一区二区三区av| 浪货趴办公桌~h揉秘书电影| 国产精品麻豆成人av电影艾秋| 亚洲www视频| 亚洲av本道一本二本三区| 亚洲 欧美 综合 在线 精品| 88久久精品无码一区二区毛片| 国产一区二区丰满熟女人妻|