• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            極品垃圾

            初學(xué)VC ,就是把每天所看到的整理到博客,慢慢消化這些內(nèi)容。見證我的學(xué)習(xí)之路吧。很多都是轉(zhuǎn)載。

            公告

            初學(xué)VC ,就是把每天所看到的整理到博客,慢慢消化這些內(nèi)容。見證我的學(xué)習(xí)之路吧。很多都是轉(zhuǎn)載。
            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統(tǒng)計(jì)

            • 隨筆 - 0
            • 文章 - 61
            • 評(píng)論 - 1
            • 引用 - 0

            常用鏈接

            留言簿(2)

            隨筆分類

            文章分類(55)

            文章檔案(61)

            搜索

            •  

            最新評(píng)論

            在VC++中利用ActiveX控件開發(fā)串行通信程序(黃海榮 田作華)
            摘  要:探討在使用Visual C++編程時(shí)利用Microsoft Communications Control控件編寫串行通信程序的方法,并給出了例程,具有一定的實(shí)用意義。
                關(guān)鍵詞:Visual C++ 串行通信 ActiveX
                在開發(fā)微機(jī)控制系統(tǒng)的過程中,我們經(jīng)常需要通過RS-232串行接口與外部設(shè)備進(jìn)行通信。例如分級(jí)控制系統(tǒng)中上位機(jī)與下位機(jī)的數(shù)據(jù)交換以及數(shù)據(jù)采集系統(tǒng)中計(jì)算機(jī)與數(shù)字儀表的通信等。在DOS時(shí)代,編寫串行通信程序是一件相當(dāng)復(fù)雜的工作,程序員需要具備相當(dāng)?shù)挠布R(shí),對(duì)可編程串行通信接口芯片的內(nèi)部寄存器定義、工作方式、指令字等相關(guān)內(nèi)容有所了解,才有可能著手編寫程序,大量的時(shí)間和精力都花在了如何與硬件打交道上,而不是花在我們的主要目的——獲取與處理數(shù)據(jù)上;在Windows下,Win32API提供了使用CreateFile/WriteFile等文件I/O函數(shù)進(jìn)行串行口操作的方法,但是在實(shí)現(xiàn)上仍然是相當(dāng)煩瑣的。幸運(yùn)的是,Windows平臺(tái)先進(jìn)的ActiveX技術(shù)使我們?cè)趯?duì)串行口編程時(shí)不再需要處理煩瑣的細(xì)節(jié)。利用已有的ActiveX控件,我們只需要編寫少量的代碼,就可以輕松高效地完成任務(wù)。本文以Windows 98下用Visual C++6.0開發(fā)PT650C秤重顯示器的通信模塊為例,探討了使用Microsoft Communications Control控件進(jìn)行串行通信的方法。
            1 ActiveX控件介紹
                ActiveX是Windows下進(jìn)行應(yīng)用程序開發(fā)的嶄新技術(shù),它的核心內(nèi)容是組件對(duì)象模型COM(Component Object Model)。ActiveX控件包括一系列的屬性、方法和事件,使用ActiveX控件的應(yīng)用程序和ActiveX控件之間的工作方式是客戶/服務(wù)器方式,即應(yīng)用程序通過ActiveX控件提供的接口來訪問ActiveX控件的功能。

                Microsoft Communications Control(以下簡稱MSComm)是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,它為應(yīng)用程序提供了通過串行接口收發(fā)數(shù)據(jù)的簡便方法。具體的來說,它提供了兩種處理通信問題的方法:一是事件驅(qū)動(dòng)(Event-driven)方法,一是查詢法。

            1.1 事件驅(qū)動(dòng)法
                在使用事件驅(qū)動(dòng)法設(shè)計(jì)程序時(shí),每當(dāng)有新字符到達(dá),或端口狀態(tài)改變,或發(fā)生錯(cuò)誤時(shí),MSComm控件將解發(fā)OnComm事件,而應(yīng)用程序在捕獲該事件后,通過檢查MSComm控件的CommEvent屬性可以獲知所發(fā)生的事件或錯(cuò)誤,從而采取相應(yīng)的操作。這種方法的優(yōu)點(diǎn)是程序響應(yīng)及時(shí),可靠性高。
            1.2 查詢法
                這種方法適合于較小的應(yīng)用程序。在這種情況下,每當(dāng)應(yīng)用程序執(zhí)行完某一串行口操作后,將不斷檢查MSComm控件的CommEvent屬性以檢查執(zhí)行結(jié)果或者檢查某一事件是否發(fā)生。例如,當(dāng)程序向串行設(shè)備發(fā)送了某個(gè)命令后,可能只是在等待收到一個(gè)特定的響應(yīng)字符串,而不是對(duì)收到的每一個(gè)字符都立刻響應(yīng)并處理。
                MSComm控件有許多重要的屬性,其中首要的幾個(gè)如表1所示。
            表1
            屬性
            說明
            CommPort 設(shè)置/獲取控件對(duì)應(yīng)的串行口
            Settings 設(shè)置/獲取波特率、校驗(yàn)方式、數(shù)據(jù)位、停止位
            PortOpen 打開/關(guān)閉通信口
            Input 讀取數(shù)據(jù)
            Output 發(fā)送數(shù)據(jù)
            2 編程實(shí)現(xiàn)
                在使用MSComm控件開發(fā)PT650C秤重顯示器通信程序時(shí),采用了事件驅(qū)動(dòng)法,主要是在comEvReceive(接收到數(shù)據(jù))事件發(fā)生時(shí)響應(yīng)并獲取緩沖區(qū)中的數(shù)據(jù)。以下具體介紹實(shí)現(xiàn)方法。
                打開Visual C++6.0集成開發(fā)環(huán)境,創(chuàng)建一個(gè)基于對(duì)話框的MFC應(yīng)用程序項(xiàng)目,命名為MyCOM,記住在設(shè)置項(xiàng)目選項(xiàng)時(shí)必須選上ActiveX Controls,其他的按照缺省設(shè)置。完成這一步后,選擇菜單項(xiàng)Project/Add to Project/Components and Controls……,將彈出一個(gè)對(duì)話框以選擇系統(tǒng)中已有的組件(Components)和控件(Controls)。選擇Registered ActiveX Controls文件夾下的Microsoft Communications Control項(xiàng)并按下Insert按鈕,將MSComm控件支持加入到本項(xiàng)目中。這時(shí)將生成一個(gè)名為CMSComm的C++類,并且在對(duì)話框編輯器里的工具欄將出現(xiàn)MSComm控件圖標(biāo)。CMSComm類是由MSComm控件導(dǎo)出的一系列接口函數(shù)構(gòu)成的,利用它將可以訪問MSComm控件的屬性(Property)和方法(Method)。
                假設(shè)PT650C秤重顯示器接在計(jì)算機(jī)COM1口上,那么打開資源編輯器,在程序主對(duì)話框(資源ID為IDD_MYCOM_DIALOG)上面放置一個(gè)MSComm控件,并用Class Wizard為該對(duì)話框類添加對(duì)應(yīng)該控件的成員變量m_wnd COM1。由于PT650C秤重顯示器與計(jì)算機(jī)進(jìn)行串行通信時(shí)采用7個(gè)數(shù)據(jù)位、1個(gè)停止位、偶校驗(yàn)方式,并且波特率為2400/4800/9600可選,這里我采用9600波特率,在對(duì)話框編輯器中設(shè)置MSComm控件的屬性如下:
            ID:IDC_COM1(資源ID)
            CommPort:1 (COM1)
            Settings:9600,e,7,1(波特率9600,偶校驗(yàn),7個(gè)數(shù)據(jù)位,1個(gè)停止位)
            RThreshold:(每接收到1個(gè)字符就觸發(fā)一個(gè)接收數(shù)據(jù)事件)
            SThreshold:0(不觸發(fā)發(fā)送緩沖區(qū)空事件)
            InputLen:1(每次讀操作從緩沖區(qū)中取一個(gè)字符)
                其他選項(xiàng)按照缺省設(shè)置或者根據(jù)具體設(shè)備的要求進(jìn)行設(shè)置。如果需要通過多個(gè)串行口與多臺(tái)設(shè)備通信,那么每一個(gè)串行口對(duì)應(yīng)于一個(gè)單獨(dú)的MSComm控件。串行口的設(shè)置參數(shù)既可以在對(duì)話框編輯器里設(shè)定,也可以在程序代碼中通過調(diào)用CMSComm類的成員函數(shù)設(shè)定。例如,我們可以在MyCOMDlg類的OnInitDialog成員函數(shù)中初始化MSComm控件的參數(shù),代碼如下:
            BOOL CMyCOMDlg::OnInitDialog()
            {
            CDialog:OnInitDialog();
            //以上為MFC框架自動(dòng)生成的代碼,在此不列出
            //TODO:Add extra initialization here
            m_wndCOM1.SetCommPort(1);
            m_wndCOM1.SetSettings("9600,e,7,1");
            m_wndCOM1.SetRThreshold(1);
            m_wndCOM1.SetSThreshold(0);
            m_wndCOM1.SetInputLen(1);
            m_wndCOM1.SetPortOpen(TRUE);//打開通信口
            return TRUE;//return TRUE unless you set the focus to a control
            }
                接下來為程序主對(duì)話框建立響應(yīng)MSComm事件的處理函數(shù),每當(dāng)MSComm控件觸發(fā)事件時(shí)該函數(shù)將被調(diào)用。在對(duì)話框編輯器中用鼠標(biāo)左鍵雙擊MSComm控件圖標(biāo),在彈出的對(duì)話框中輸入函數(shù)名OnCommCOM1,該事件處理函數(shù)的原型定義和消息映射入口將自動(dòng)被添加到CMyCOMDlg類中,我們所要做的只是在OnCommCOM1函數(shù)中給出具體的數(shù)據(jù)處理程序段,代碼示例如下:
            void CMyCOMDlg::OnCommCom1()
            {
            //TOD O:Add your control notification handler code here
            CString sInput;
            switch(m_wndCOM1.GetCommEvent())
            {
            case 1: //comEvSend事件
            /*如有數(shù)據(jù)要發(fā)送,可采用以下代碼:
            VARIANT varOut;
            VariantInit(&varOut);
            varOut.vt=VT_BSTR;
            USES_CONVERSION;
            varOut.bstrVal=SysAllocString(T2OLE)("My data"));
            if(varOut.bstrVal){
            m_wndCOM1.SetOutput(varOut);
            SysFreeString(varOut.bstrVal);
            }
            */
            break;
            case 2: //comEvReceiv事件,有數(shù)據(jù)到達(dá)
            sInput=m_wndCOM1.GetInput().bstrVal;
            //對(duì)接收到的數(shù)據(jù)做必要處理
            break;
            case 1009://comEventRxParity事件,奇偶校驗(yàn)錯(cuò)誤
            //錯(cuò)誤處理代碼
            break;
            default:
            break;
            }
              
                在這里必須注意的一點(diǎn)是在發(fā)送字符數(shù)據(jù)時(shí),必須向MSComm控件提供Unicode格式的字符串,在以上代碼中用到了USES_CONVERSION和T2OLE宏進(jìn)行ANSI字符串到Unicode字符串的轉(zhuǎn)換,具體內(nèi)容可參考Visual C++6.0所帶的MSDN文檔,在此不加贅述。
                本文對(duì)Windows 98下Visual C++ 程序中使用MSComm串行通信ActiveX控件編程的方法做了探討,顯示了ActiveX技術(shù)的強(qiáng)大功能、充分的靈活性和易用性,具有一定的實(shí)踐意義。

            posted on 2009-05-20 17:04 極品垃圾 閱讀(220) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 單片機(jī)

            久久精品桃花综合| 久久国产高潮流白浆免费观看| 少妇人妻88久久中文字幕| 亚洲人成伊人成综合网久久久 | 人妻无码久久一区二区三区免费| 亚洲精品乱码久久久久66| 久久国产精品-国产精品| 精品久久久久久无码人妻蜜桃| 欧美午夜精品久久久久久浪潮| 亚洲精品国产自在久久| 久久综合一区二区无码| 99久久精品国产麻豆| 久久久精品无码专区不卡| 东方aⅴ免费观看久久av| 91麻豆精品国产91久久久久久| 亚洲国产精品成人久久蜜臀| 久久精品国产亚洲av日韩| 天堂无码久久综合东京热| 国产91色综合久久免费分享| 国产精品久久久香蕉| 9久久9久久精品| 国产精品久久久久久久app | 色综合久久久久无码专区| 99精品国产在热久久无毒不卡 | 亚洲欧美伊人久久综合一区二区| 欧美亚洲国产精品久久蜜芽| 亚洲欧美日韩中文久久 | 亚洲国产成人久久综合区| 国产精品18久久久久久vr| 亚洲国产精品成人久久| 亚洲欧美国产精品专区久久| 国产综合成人久久大片91| 国产成人久久777777| 国产精品天天影视久久综合网| 亚洲AV无一区二区三区久久 | 国内精品久久九九国产精品| 三级三级久久三级久久| 久久久黄色大片| 亚洲一区精品伊人久久伊人| 要久久爱在线免费观看| 久久久黄色大片|