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

        ?

        基于Windows下Qt與脈沖發(fā)生器的串口通訊實現(xiàn)

        2016-10-31 08:45:25李鵬軍蘭殿星寧文斌宋軍偉
        計算機測量與控制 2016年4期
        關鍵詞:發(fā)送數(shù)據(jù)線程串口

        李鵬軍,蘭殿星,寧文斌,袁 攀,宋軍偉

        (許繼電源公司 特種電源部,河南 許昌 461000)

        ?

        基于Windows下Qt與脈沖發(fā)生器的串口通訊實現(xiàn)

        李鵬軍,蘭殿星,寧文斌,袁攀,宋軍偉

        (許繼電源公司 特種電源部,河南 許昌461000)

        串口通訊在工業(yè)領域有著重要的作用,大部分工業(yè)設備都使用串口通訊和上位機遠程通訊;VC6.0的簡單易用在工業(yè)中經(jīng)常被使用制作各種復雜的監(jiān)控控制軟件,但是VC的圖形繪制、API接口功能和所制作軟件移植性存在很多不方便的地方,該實現(xiàn)方法成功使用了VC嵌套Qt的方法解決了該問題;以脈沖發(fā)生器儀器為下位機舉例,在WindowsXP環(huán)境下,使用VC6.0嵌套Qt3.3,制作上位機RS232通訊控制圖形軟件;使用該軟件通訊功能用戶可以設置不同的脈沖發(fā)生器參數(shù),輸出不同的脈沖序列,該軟件所使用的界面、線程、串口支持類全部由Qt支持,不使用MFC功能,最終完成軟件編寫;結果表明,在很低的電腦配置中,Windows環(huán)境下,使用VC嵌套Qt的方式也能快速的設計出一款界面完整、功能齊全、穩(wěn)定性高、移植性強的工業(yè)控制軟件。

        嵌套;Qt;Vc;QextSerialPort類;線程;串口編程

        0 引言

        串口通信在工業(yè)中使用范圍很廣,有很多機器及儀器都大量使用串口通訊的方式,所以作為上位機和下位機之間的通訊[1],串口通訊的功能是在軟件的使用中是一個重要的部分。同時在工業(yè)軟件的設計中,由于大部分設計軟件不能應用于Windows XP 以上的系統(tǒng),VC6.0和Qt3.3兩個具有內(nèi)存占用小,編程方便的特點,能完美應用于XP系統(tǒng)。但是VC6.0的圖形編輯能力較差,不能較好地實現(xiàn)人性化人機界面,也不具備很強的移植性[2]。所以這里提出了VC嵌套Qt的概念,Qt是一個多平臺的C++圖形用戶程序框架,因為其面向?qū)ο?、易擴展、可實現(xiàn)組件編程等特點,已經(jīng)成為熱門的編程軟件。由于Qt同樣采用C++語言,方便了VC6.0和Qt的嵌套使用,這樣設計的軟件程序不是以MFC為基礎,減少了程序的出錯率。該實現(xiàn)方法結合開發(fā)實例對帶有圖形界面的串口通信程序設計過程進行了詳細的闡述。同時以脈沖發(fā)生器(575 Series Pulse)SCPI語言和上位機通訊為例介紹。

        1 實現(xiàn)方法說明

        軟件采用PC端為上位機[3],脈沖發(fā)生器為下位機的,串口互聯(lián)SCPI語言通訊的方法。軟件編譯環(huán)境為VC6.0,軟件設計實現(xiàn)過程如圖1所示。

        圖1 實現(xiàn)過程圖

        軟件調(diào)用QextSerialPort對象,并使用線程實現(xiàn)串口數(shù)據(jù)的接收,使用定時器實現(xiàn)串口數(shù)據(jù)的發(fā)送。發(fā)送數(shù)據(jù)和接收數(shù)據(jù)全部使用堆棧式列表數(shù)據(jù)緩沖區(qū),保證接收數(shù)據(jù)不會出現(xiàn)漏針、發(fā)送數(shù)據(jù)嚴格按照固定間隔時間發(fā)送,避免下位機通訊過快死機問題[4-5]。軟件實現(xiàn)方法如圖2所示。

        圖2 軟件實現(xiàn)方法圖

        2 VC6.0建立Qt工程

        這里直接使用VC嵌套Qt后產(chǎn)生的工具欄生成一個Dialog的工程,工程名字命名為“PulseGen”;工程會自動生成“pulsegendialogimpl”為名的執(zhí)行頭文件和源文件,以后所有的程序都需要寫到該執(zhí)行文件中,可以看到這里可以直接定義Qt信號和槽,頭文件代碼如下:

        include "pulsegendialog.h"

        class PulseGenDialogImpl : public PulseGenDialog

        {

        Q_OBJECT

        public:

        PulseGenDialogImpl( QWidget* parent = 0,const char* name = 0,bool modal = FALSE,WFlags f = 0 );

        };

        源文件代碼如下:

        include "pulsegendialogimpl.h"

        PulseGenDialogImpl::PulseGenDialogImpl( QWidget* parent,const char* name,bool modal,WFlags f )

        : PulseGenDialog( parent,name,modal,f )

        {// Add your code}

        使用VC編譯后,會產(chǎn)生“PulseGen.pro”文件,使用“Qt Designer”可以打開該文件添加項目文件、修改界面布局、增加界面空間等功能,修改完成后,直接使用VC編譯即可生產(chǎn)exe文件。

        3 Qt界面制作

        使用Qt Designer,打開pro工程而文件,可以方便的設計各種復雜界面,先根據(jù)功能大致做好界面,然后添加QextSerialPort串口接口文件。Qt Designer可以靈活的設置界面控件顏色及字體,如圖3所示。

        圖3 界面制作示意圖

        這個界面主要提供了串口設置功能、T0的觸發(fā)功能及每個觸發(fā)通道的參數(shù)設置。

        4 設備類線程創(chuàng)建、代碼編寫

        使用Qt Designer增加deviceCe類文件,該類繼承QThread,該線程負責串口的數(shù)據(jù)發(fā)送和接收處理功能[6]。

        在deviceCe頭文件類中增加串口的對象聲明,為了方便串口的數(shù)據(jù)發(fā)送和接收,同時定義串口發(fā)送、接收的列表緩沖區(qū)和結構體,在發(fā)送和接收數(shù)據(jù)的時候,將發(fā)送字節(jié)和接收字節(jié)增加到緩沖區(qū)列表中,處理的時候會從第一行往下依次處理數(shù)據(jù),處理一次數(shù)據(jù)刪除一行數(shù)據(jù),這樣不會造成緩沖區(qū)數(shù)據(jù)的積累和出錯,為了保證串口數(shù)據(jù)接收穩(wěn)定,在每次發(fā)送完數(shù)據(jù)50 ms以后讀取下一次數(shù)據(jù),并強制發(fā)送數(shù)據(jù)間隔時間為500 ms,這樣串口數(shù)據(jù)接收非常穩(wěn)定。deviceCe頭文件添加代碼如下:

        struct cmdStruct //接收命令的結構體

        {

        unsigned char m_buff[ 300 ] ;

        int m_length;

        };

        struct cmdSend //發(fā)送命令的結構體

        {

        char m_buff[ 300 ] ;

        int m_length;

        };

        class deviceCe : public QThread

        //繼承線程

        {

        public:

        QValueList m_listCmd ;

        //接受命令列表緩存

        QValueList m_listSend;

        //發(fā)送命令列表緩存

        void AppendChar( const char *cmdChar ,short lengthCmd );//發(fā)送命令緩存到列表中

        void OpenCom( QString theComStr);

        //打開串口

        void CloseCom(); //關閉串口

        void readMyCom( int theLength);

        //讀取串口數(shù)據(jù)

        void SendMessage(); //發(fā)送數(shù)據(jù)

        void GetLength(); //獲取接收數(shù)據(jù)長度

        private:

        QTime reTime; //接收數(shù)據(jù)的強制時間

        Win_QextSerialPort *myCom ; //串口對象聲明

        };

        源代碼中添加打開串口命令代碼:

        //存放串口參數(shù)結構體

        PortSettings myComSetting = {FLOW_OFF,PAR_NONE ,DATA_8,STOP_1,BAUD38400,0,500};//定義串口對象,并傳遞參數(shù),并初始化

        myCom = new Win_QextSerialPort(theComStr,myComSetting);

        //以可讀寫方式打開串口

        if(myCom->open(IO_ReadWrite))

        {…}

        讀取串口數(shù)據(jù)代碼如下,GetLength函數(shù)調(diào)用:

        char theReChar[300];

        myCom->readBlock( theReChar ,theLength); //按照個數(shù)讀取數(shù)

        cmdStruct m_scmd ;

        memcpy( m_scmd.m_buff ,theReChar,cmdLength);

        m_scmd.m_length = cmdLength ;

        m_listCmd.append( m_scmd ) ; //接收數(shù)據(jù)到緩沖列表中。

        發(fā)送數(shù)據(jù)添加到緩沖列表代碼如下(由界面調(diào)用):

        void deviceCe::AppendChar( const char *cmdChar ,short lengthCmd )

        {

        cmdSend m_setValueStuct ;

        memcpy( m_setValueStuct.m_buff ,cmdChar,lengthCmd );

        m_setValueStuct.m_length = lengthCmd ;

        m_listSend.append( m_setValueStuct );

        }

        在串口存在數(shù)據(jù)時,讀取數(shù)據(jù),由reTime定時器調(diào)用,代碼如下:

        void deviceCe::GetLength()

        {

        int m_length = myCom->bytesWaiting();

        if( m_length > 1)

        {

        readMyCom( m_length );

        }

        }

        線程函數(shù)編程如下:

        發(fā)送數(shù)據(jù)函數(shù),該函數(shù)由界面定時器定時調(diào)用:

        void deviceCe::SendMessage()

        {

        QString msgStr ;

        cmdSend sendStuct ;

        if ( !m_listSend.isEmpty() )

        {

        sendStuct = m_listSend.first() ;

        myCom ->writeBlock( sendStuct.m_buff,sendStuct.m_length );

        m_listSend.pop_front();

        reTime.restart(); //強制時間開啟,有發(fā)送命令的時候,接收數(shù)據(jù)

        }

        else

        reTime.restart();

        }

        線程編程如下:

        void deviceCe::run()

        {

        cmdStruct reCmdDo;

        while(m_stop == false)

        {

        if ( reTime.elapsed() > 50 )

        {

        GetLength();

        }

        if ( !m_listCmd.isEmpty()) //接受判斷

        {

        reCmdDo = m_listCmd.first();

        m_listCmd.pop_front();

        }

        }

        5 界面執(zhí)行文件編程

        界面編程主要是增加信號槽、關聯(lián)deviceCe對象、界面刷新編程幾個內(nèi)容。

        按鈕、定時器槽函數(shù)相應代碼定義如下:

        class PulseGenDialogImpl : public PulseGenDialog

        {

        Q_OBJECT

        public:

        PulseGenDialogImpl( QWidget* parent = 0,const char* name = 0,bool modal = FALSE,WFlags f = 0 );

        protected:

        QTimer* m_pTimerProcessUI;//界面刷新時間

        QTimer* m_pTimerSendMsg; //發(fā)送命令時間

        deviceCe *p_device ; //設備類對象

        //根據(jù)不同的功能組成SCPI命令,一般都是:PULSE開頭的

        void btSetCmd( QString m_msg );

        protected slots:

        void processUI(); //界面刷新

        void sendMsg(); //發(fā)送數(shù)據(jù)

        void btOpenCom(); //打開串口

        void btCloseCom(); //關閉串口

        /*其它的按鈕相應*/

        }

        脈沖發(fā)生器使用SCPI命令,下面函數(shù)負責組成SCPI命令,發(fā)送函數(shù)只需要填入內(nèi)容即可,如下面代碼所示:

        void PulseGenDialogImpl::btSetCmd( QString m_msg )

        {

        const char* theSendBuff ;

        //組成字符串,并且末尾增加換行符

        QString strBy = tr(":PULSE%1/n").arg( m_msg );

        //發(fā)送SCPI命令

        theSendBuff = strBy.latin1();

        p_device->AppendChar( theSendBuff ,strlen( theSendBuff ) ) ;

        }

        比如需要通道1設置延時,可以直接使用代碼:

        int chID = textchID->text().toInt(); //通道號

        QString str ;

        double theWid = textDelay->text().toDouble() ;

        str = tr("%1:DELAY %2").arg( chID).arg( theWid );

        btSetCmd( str ) ;

        在這里,pTimerProcessUI關聯(lián)界面相應,pTimerSendMsg關聯(lián)發(fā)送函數(shù),如下代碼:

        connect(m_pTimerProcessUI,SIGNAL(timeout()),this,SLOT(processUI())); connect(m_pTimerSendMsg,SIGNAL(timeout()),this,SLOT(sendMsg()));

        m_pTimerProcessUI->start(400); m_pTimerSendMsg->start(500) ;

        sendMsg負責按照500 ms發(fā)送一次數(shù)據(jù),代碼如下:

        void PulseGenDialogImpl::sendMsg() //定時發(fā)送數(shù)據(jù)

        {p_device->SendMessage();}

        6 軟件功能驗證

        試驗方法通過界面設置T0參數(shù)如圖4所示。脈沖發(fā)生器回復串口數(shù)據(jù)如圖5所示。實際脈沖發(fā)生器輸出10 μs周期脈沖,如圖6所示。

        圖4 界面設置圖

        圖5 回復串口數(shù)據(jù)圖

        圖6 輸出脈沖圖(時間:20 μs一格)

        7 結果與分析

        通過上位機軟件串口通訊功能成功的設置了脈沖發(fā)生器的重頻時間,并且通過示波器成功監(jiān)視到符合要求的波形,脈沖發(fā)生器通過回復“OK”命令表示命令執(zhí)行成功,完善軟件其它通道參數(shù)設置通信內(nèi)容,實現(xiàn)了同步機全部參數(shù)設置功能。

        8 結論

        該實現(xiàn)方法通過Qt與VC6.0的結合方式,完美的解決了VC6.0的圖形編輯能力的弱點,集成了線程、接口,這樣編程的方式大大提高了在工業(yè)軟件監(jiān)控軟件中的開發(fā)效率。

        [1] 佘立,李志強. 基于Qt的多串口多協(xié)議數(shù)據(jù)接收解析軟件的設計與實現(xiàn)[J]. 電子質(zhì)量,2011,01:34-36.

        [2] 張新村,嚴殊. 基于ARM的Linux系統(tǒng)下Qt串口助手的設計[J]. 軟件導刊,2011,08:64-66.

        [3] 孟繁磊,穆麗紅,王小曼. 基于linux和Qt的串口通信調(diào)試器調(diào)的設計及應用[J]. 科技創(chuàng)新導報,2011,32:24.

        [4] 嚴賢,韓秀玲. 基于Qt的串口通信應用研究與實現(xiàn)[J]. 微計算機信息,2012,08:114-116.

        [5] 陳旭紅,高文學. Qt/Embedded串口類的設計及應用[J]. 湖北汽車工業(yè)學院學報,2010,04:51-53,58.

        [6] 胡軍鋒,宋文杰,尤澤萌. Qt中基于線程串口采集方式的實現(xiàn)[J]. 科技視界,2014,28:5,28.

        Implementation of Serial Communication to Pulse Generator Based on Qt in Windows Environment

        Li Pengjun,Lan Dianxing,Ning Wenbing,Yuan Pan,Song Junwei

        (XJ Power CO.,Xuchang461000,China)

        Serial communication plays important role in industrial area,most of industrial equipment using serial communication connect to PC terminal. VC6.0 is easy to use in industry and often used to monitor variety complex software production,but VC has many inconvenient places in graphics rendering,API interface function and software portability.Implementation method successfully used VC nesting Qt way to solve this problem. Pulse generator equipment as lower-computer,for example,use VC6.0 nested Qt3.3,making PC graphics software by RS232 communication in Windows XP。Using communication users can set different parameters to let pulse generator outputs various pulse sequences.Interface ,thread and serial support classes of Software all supported by Qt not using MFC.Implementation finally completed software development. Results showed that low computer configuration,in Windows environment,using VC nested Qt way can quickly design a complete interface,full-featured,high stability,easy portability industrial control software.

        nest;Qt;Vc;Class QextSerialPort;thread;serial communication

        1671-4598(2016)04-0206-04< class="emphasis_italic">DOI

        :10.16526/j.cnki.11-4762/tp.2016.04.060

        TP314

        A

        2015-10-23;

        2015-11-29。

        李鵬軍(1985-),男,河南焦作人,大專,工程師,主要從事脈沖功率方向的研究。

        猜你喜歡
        發(fā)送數(shù)據(jù)線程串口
        移動自組網(wǎng)中MAC層協(xié)議研究
        淺談AB PLC串口跟RFID傳感器的通訊應用
        基于馬爾科夫鏈的LoRaWAN網(wǎng)絡節(jié)點性能分析
        帶標記方式的CRDSA++協(xié)議性能分析*
        通信技術(2018年10期)2018-10-15 07:30:00
        淺談linux多線程協(xié)作
        使用IPSec安全傳輸數(shù)據(jù)
        USB接口的多串口數(shù)據(jù)并行接收方法探索
        基于藍牙串口適配器的GPS接收機與AutoCAD的實時無線通信
        地礦測繪(2015年3期)2015-12-22 06:27:26
        基于并行控制的FPGA多串口拓展實現(xiàn)
        Linux線程實現(xiàn)技術研究
        亚洲精品无码专区在线在线播放| 在线观看极品裸体淫片av| 精品中文字幕久久久人妻| 亚洲天堂成人av影院| av无码精品一区二区三区宅噜噜| 香蕉视频在线观看国产| 亚洲av伊人久久综合性色| 开心激情视频亚洲老熟女| 欧美猛少妇色xxxxx猛交| 国产又黄又大又粗视频| 91日本在线精品高清观看| 久久精品国产黄片一区| 99久久精品免费看国产| 亚洲av无码精品色午夜果冻不卡| 国产成人精品三上悠亚久久| 日本女优免费一区二区三区| 欧洲乱码伦视频免费| 亚洲日韩精品欧美一区二区| 国产精品美女黄色av| 亚洲桃色蜜桃av影院| 日韩视频在线观看| 装睡被陌生人摸出水好爽| 久久久久久AV无码成人| 久久人妻中文字幕精品一区二区 | 人妖系列在线免费观看| 成年女人免费v片| 午夜福利麻豆国产精品 | 亚洲国产av自拍精选| 一区二区视频在线观看地址| 国产精品毛片一区二区| 国产无码swag专区| 亚洲小少妇一区二区三区| 亚洲av色香蕉一区二区三区| 把插八插露脸对白内射| 亚洲色欲色欲www成人网| av在线天堂国产一区| 成年女人免费视频播放体验区| 国产高清无码在线| 国产免费一区二区三区在线观看| 免费a级毛片在线播放不收费| 亚洲va欧美va国产综合|