在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 用VC++.NET實(shí)現(xiàn)C167CR單片機(jī)與PC的串行通信

            用VC++.NET實(shí)現(xiàn)C167CR單片機(jī)與PC的串行通信

            作者: 時(shí)間:2010-08-11 來(lái)源:網(wǎng)絡(luò) 收藏
            1 引言

            PC與單片機(jī)構(gòu)成的上位機(jī)、下位機(jī)分布式控制系統(tǒng)是一種常見(jiàn)的工業(yè)控制系統(tǒng),單片機(jī)作為下位機(jī)可進(jìn)行現(xiàn)場(chǎng)數(shù)據(jù)采集和就地控制,并可將采集到的數(shù)據(jù)或者狀態(tài) 信息傳送到上位PC機(jī),以做進(jìn)一步的分析處理。在實(shí)際應(yīng)用中,上位機(jī)與下位機(jī)的通信問(wèn)題是首要解決的問(wèn)題之一,以其高效率、可靠、標(biāo)準(zhǔn)統(tǒng)一的優(yōu)點(diǎn) 成為重要的通信手段,本文即在WINDOWS XP環(huán)境下,使用 中的MSComm控件實(shí)現(xiàn)C167CR單片機(jī)與PC之間的,其通信線路通過(guò)RS232連接(距離小于15m)。

            2 C167CR單片機(jī)串行接口簡(jiǎn)介

            是德國(guó)Infineon公司(前西門(mén)子半導(dǎo)體部)開(kāi)發(fā)的一種16位單片機(jī),屬于單片機(jī)中的高端產(chǎn)品,片內(nèi)有16通道10A/D轉(zhuǎn)換 器、9個(gè)定時(shí)器、2個(gè)串行接口以及15個(gè)報(bào)文的CAN接口等功能模塊。C167CR單片機(jī)有兩種類(lèi)型的串行接口:異步/同步串行接口(ASC0)和高速同 步串行接口(SSC),下面介紹異步/同步串行接口(ASC0)。ASC0的接口功能是通過(guò)設(shè)置幾個(gè)專(zhuān)用寄存器來(lái)予以確定。

            2.1 異步/同步串行接口(ASC0

            16位控制寄存器S0CON的各位定義如圖1所示。

            數(shù)據(jù)接收由接收使能位S0REN來(lái)控制,只有當(dāng)波特率生成器啟動(dòng)位S0R置為1”時(shí),才能進(jìn)行串行數(shù)據(jù)的發(fā)送和接收。

            2.2 ASC0波特率寄存器S0BG

            寄存器S0BG具有雙重功能,可用作波特率生成器和重載寄存器,它具有13位的重載能力,不同的重載值對(duì)應(yīng)不同的波特率。讀SOBG時(shí),返回的是定時(shí)器的內(nèi)容(1513位返回為0),寫(xiě)SOBG時(shí),將更改重載寄存器的值(1513位無(wú)效)。

            2.3 緩存寄存器

            串行口ASC0有兩個(gè)緩存寄存器:接收緩存寄存器S0RBUF和發(fā)送緩存寄存器S0TBUF。發(fā)送時(shí)只要發(fā)送器空閑,裝載到S0TBUF中的數(shù)據(jù)將立即轉(zhuǎn)送到發(fā)送移位寄存器進(jìn)行發(fā)送。將S0R S0REN置位,可直接從接收緩存寄存器S0RBUF讀取數(shù)據(jù)。

            2.4 中斷寄存器

            串行口ASC04個(gè)可位尋址的中斷控制寄存器,發(fā)送中斷寄存器S0TIC,發(fā)送緩存器中斷寄存器S0TBIC,接收中斷寄存器S0RIC,串行口ASC0錯(cuò)誤中斷寄存器S0EIC。只有當(dāng)總中斷允許位IEN1”時(shí),這些中斷寄存器才能進(jìn)行控制。

            3 控件

            MSComm介紹

            WINDOWS環(huán)境下,用戶不能直接對(duì)PC的串行端口進(jìn)行操作。 中,通過(guò)使用微軟公司提供的Microsoft Comm Control控件(簡(jiǎn)稱(chēng)MSComm),可以方便地實(shí)現(xiàn)PC與外部設(shè)備之間的串行通信,編程工作量相對(duì)較少。注意Visual C++.NET中控件MSComm的函數(shù)與Visual C++6.0中的控件函數(shù)有所不同。MSComm有二十多個(gè)屬性,其中主要的屬性有:

            CommPort:設(shè)置和返回通信端口號(hào),CommPort1即使用串行端口Com1。
            PortOpen
            :打開(kāi)或關(guān)閉通信端口。
            InBufferSize
            :設(shè)置接收緩沖區(qū)大小。
            OutBufferSize
            :設(shè)置發(fā)送緩沖區(qū)大小。
            Input
            :讀取并刪除緩存區(qū)中的數(shù)據(jù)。
            Output
            :將數(shù)據(jù)寫(xiě)入發(fā)送緩存區(qū)。
            Settings
            :設(shè)置波特率、奇偶校驗(yàn)、數(shù)據(jù)位和停止位參數(shù),默認(rèn)值為“9600,N,8,1”,即波特率9600b/s、不進(jìn)行奇偶校驗(yàn)、8個(gè)數(shù)據(jù)位、1個(gè)停止位。
            InputLen
            :設(shè)置每次從緩存區(qū)讀取的字節(jié)數(shù)。

            InputMode:設(shè)置和返回?cái)?shù)據(jù)類(lèi)型,設(shè)置為0時(shí)讀取的數(shù)據(jù)為文本形式,設(shè)置為1時(shí)讀取的數(shù)據(jù)為二進(jìn)制數(shù)據(jù)。PC與單片機(jī)通信時(shí),InputMode屬性常設(shè)置為二進(jìn)制數(shù)據(jù)形式。
            Rthreshold
            :設(shè)置OnComm事件發(fā)生前,接收緩存區(qū)可以接收的字符數(shù)。若設(shè)置為0,則不產(chǎn)生OnComm事件。

            串行通信控件MSComm有二種處理通信的工作方式:事件驅(qū)動(dòng)方式和查詢工作方式。事件驅(qū)動(dòng)方式是指:當(dāng)串行端口接收或發(fā)送完指定數(shù)量數(shù)據(jù)以及發(fā)生通信錯(cuò) 誤等情況時(shí),MSComm控件觸發(fā)OnComm事件,作出相應(yīng)處理。查詢工作方式是指:通過(guò)查詢控件的某些屬性值(如InBufferCount屬性)來(lái) 作出進(jìn)一步的處理。以下的程序?qū)嵗捎檬录?qū)動(dòng)方式來(lái)接收數(shù)據(jù)。

            4 串行通信程序?qū)嵗?/SPAN>

            41程序功能

            本程序是在WINDOWS XP環(huán)境下進(jìn)行數(shù)據(jù)的發(fā)送和接收,PC一次性向C167CR單片機(jī)發(fā)送12字節(jié)(ASCII字符)的數(shù)據(jù),單片機(jī)接收完數(shù)據(jù)后,再返回所接收到的所有數(shù)據(jù),通過(guò)比較PC發(fā)送和接收到的數(shù)據(jù),驗(yàn)證串行通信的可靠性。

            42 PC通信程序設(shè)計(jì)

            421 實(shí)現(xiàn)步驟

            第一步:?jiǎn)?dòng)“Visual Studio.NET”,選擇新建項(xiàng)目,在項(xiàng)目類(lèi)型窗口中選擇“Visual C++項(xiàng)目,模板窗口選擇“MFC應(yīng)用程序。輸入項(xiàng)目名稱(chēng),單擊確定按鈕。應(yīng)用程序類(lèi)型選擇基于對(duì)話框,其他設(shè)置皆為默認(rèn)值,單擊完成按鈕。

            第二步:選擇工具菜單下子菜單自定義工具箱COM組件中的“Microsoft Communication Control,Version6.0”,單擊確定按鈕,插入MSComm控件。這與Visual C++6.0的插入方法不同。

            第三步:刪去應(yīng)用程序主對(duì)話框中的靜態(tài)文本和確定按鈕,將取消按鈕改為退出程序。添加兩個(gè)靜態(tài)文本發(fā)送數(shù)據(jù)接受數(shù)據(jù),以及兩個(gè)編輯框、一個(gè)按鈕開(kāi)始通信和一個(gè)MSComm控件。

            第四步:添加變量和事件處理程序。由于Visual C++.NET沒(méi)有ClassWizard,添加方法與Visual C++6.0不同。右鍵單擊控件,通過(guò)子菜單添加變量添加事件處理程序實(shí)現(xiàn)此步驟。為兩個(gè)編輯框分別添加CString型全局變量m_Send m_Receive,并為開(kāi)始通信按鈕添加BN_CLICKED事件處理函數(shù)OnSendData(),為MSComm控件添加CMSComm型變 量m_ComOnComm事件處理函數(shù)OnCommMscomm()。其中函數(shù)OnSendData()用來(lái)發(fā)送數(shù)據(jù),函數(shù)OnCommMscomm ()用來(lái)接收數(shù)據(jù)。

            窗體界面如圖2所示。

            用VC++.NET實(shí)現(xiàn)C167CR單片機(jī)與PC的串行通信

            4.2.2 Visual C++.NET程序代碼

            在OnInitDialog()函數(shù)中進(jìn)行串行口初始化

            BOOL CserialDlg::OnInitDialog()
            {//省略自動(dòng)生成的代碼
            // TODO:在此添加額外的初始化代碼
            m_Com.put__CommPort(1); //設(shè)置串口為COM1
            m_Com.put_InBufferSize(1024); //設(shè)置輸入緩存區(qū)的大小,Bytes
            m_Com.put_OutBufferSize(512); //設(shè)置發(fā)送緩存區(qū)的大小,Bytes
            m_Com.put_PortOpen(true); // 打開(kāi)串口
            m_Com.put_InputMode(1); //以二進(jìn)制方式接收數(shù)據(jù)
            m_Com.put_Settings(“9600,n,8,1”); //設(shè)置數(shù)據(jù)傳輸速率等參數(shù)
            m_Com.put_RThreshold(12); //表示收到12個(gè)字符引發(fā)一個(gè)OnComm事件
            m_Com.put_InputLen(0); //一次讀出接收緩存區(qū)的字符
            m_Com.get_Input(); //清空接收緩存區(qū)
            return TRUE; // 除非設(shè)置了控件的焦點(diǎn),否則返回 TRUE
            }

            數(shù)據(jù)發(fā)送程序代碼

            void CserialDlg::OnSendData()
            { // TODO: 在此添加控件通知處理程序代碼
            if(!m_Com.get_PortOpen()) m_Com.put_PortOpen(true); //若沒(méi)打開(kāi)串口,則打開(kāi)
            UpdateData(true); //將編輯框中的數(shù)據(jù)傳遞給變量
            m_Com.put_Output(COleVariant(m_Send)) ; //將編輯框中的字符串?dāng)?shù)據(jù)轉(zhuǎn)換
            VARIANT類(lèi)型,并發(fā)送出去
            }

            數(shù)據(jù)接收程序代碼

            void CserialDlg::OnCommMscomm()
            { // TODO: 在此添加消息處理程序代碼
            VARIANT vReceive;
            COleSafeArray sReceivearray;
            long k , i;
            BYTE bReceive[1024];
            CString str;
            m_Receive="";
            k=m_Com.get_CommEvent();
            switch(k){
            case 2: //接收到Rthreshold個(gè)數(shù)據(jù)
            vReceive=m_Com.get_Input(); //讀取緩存區(qū)內(nèi)的數(shù)據(jù)
            sReceivearray=vReceive; //將數(shù)據(jù)由VARIANT型轉(zhuǎn)換為SafeArray型
            for(i=0;i12;i++)
            sReceivearray.GetElement(i,bReceive+i); //將數(shù)據(jù)轉(zhuǎn)換為BTYE型數(shù)組
            for (i=0;i5;i++)
            { char a=*(char*)(bReceive+i);
            str.Format("%c",a);
            m_Receive+=str; } //將數(shù)據(jù)轉(zhuǎn)換為CString型,傳遞給變量m_Receive
            UpdateData(false); //更新編輯框內(nèi)容
            break;
            default: break;
            }
            }

            程序中的put_Output()函數(shù)要求VARIANT型數(shù)據(jù)作為參數(shù),可以調(diào)用類(lèi)ColeVariant的構(gòu)造函數(shù)將多種類(lèi)型數(shù)據(jù)(如CString,int等)轉(zhuǎn)換為VARIANT類(lèi)型數(shù)據(jù)。同時(shí)數(shù)據(jù)接收函數(shù)get_Input()接收到的數(shù)據(jù)為VARIANT類(lèi)型,可通過(guò)一系列轉(zhuǎn)換,轉(zhuǎn)換為所要求的類(lèi)型予以顯示。


            4.3 通信程序設(shè)計(jì)

            串行通信程序采取8位數(shù)據(jù)異步發(fā)送工作方式,接收數(shù)據(jù)使用中斷方式,接收完12字節(jié)數(shù)據(jù)后再將全部數(shù)據(jù)發(fā)送出去。具體C語(yǔ)言程序如下。
            初始化程序:

            #include reg167.h>
            void init(void)
            { P3 |= 0x0400; /*設(shè)置輸入、輸出引腳*/
            DP3 |= 0x0400;
            DP3 = 0xF7FF;
            S0BG = 0x40; /*設(shè)置波特率為9600*/
            S0CON = 0x8011; /*設(shè)置串行口狀態(tài):8位數(shù)據(jù)異步工作方式,1位停止位等*/
            S0RIC=0x0044; /*設(shè)置中斷允許位、中斷優(yōu)先級(jí)*/
            IEN=1; } /*中斷全局使能*/

            主程序:

            #include reg167.h>
            extern void init(void);
            static unsigned int i=0;
            static unsigned char c[5];
            unsigned int n;
            void serialcom (void) interrupt 0x2B using s_rbank{ /*中斷接收數(shù)據(jù)*/
            if(i==0) c[0]=S0RBUF; else c[i]=S0RBUF;
            if(i==11) { for(n=0;n12;n++) S0TBUF=c[n]; } /*接收12個(gè)字節(jié)后發(fā)送*/
            i=i+1; if(i==12) i=0;
            }
            void main (void) { init (); while (1) {S0RIR=0;} }



            評(píng)論


            相關(guān)推薦

            技術(shù)專(zhuān)區(qū)

            關(guān)閉