<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > WINDOWS環(huán)境下PC機(jī)與單片機(jī)的通信

          WINDOWS環(huán)境下PC機(jī)與單片機(jī)的通信

          作者: 時(shí)間:2012-03-29 來源:網(wǎng)絡(luò) 收藏

          在自動(dòng)控制系統(tǒng)中,機(jī)與組成上位機(jī)和下位機(jī),其基本構(gòu)成是:下位機(jī)(系統(tǒng))完成信號(hào)檢測(cè)、A/D轉(zhuǎn)換和簡(jiǎn)單的控制功能,通過系統(tǒng)總線(如RS-232、RS-485、USB)與上位機(jī)(機(jī))相連,進(jìn)行監(jiān)測(cè)、控制,形成主從式結(jié)構(gòu)。下面就上位機(jī)和下位機(jī)之間目前幾種常用的通訊方法作一些介紹。

          本文引用地址:http://www.ex-cimer.com/article/171749.htm

          1、RS-232的串行通訊

          在工業(yè)控制中,串口是常用的計(jì)算機(jī)與外部串行設(shè)備之間的數(shù)據(jù)傳輸通道,由于串行方便易行,成本低,且完全能滿足要求,所以應(yīng)用廣泛。

          1.1、利用VC++的標(biāo)準(zhǔn)函數(shù)

          利用VC++的標(biāo)準(zhǔn)函數(shù)_inp和_outp可實(shí)現(xiàn)串口通信。下面是一個(gè)串口初始化的程序:
          Void init_com (PORT)
          {char i;
          outp(PORT+3,0x80);
          outp(PORT,0x0C);
          outp(PORT+1,0);
          outp(PORT+3 ,0x3a);
          outp(PORT+3 ,0x03);
          i=inp(PORT+5) 0xfe;
          outp(PORT+5,i);}

          1.2、使用串行通信控件MSComm

          MSCOMM控件,即Microsoft Communication Control,是Microsoft為簡(jiǎn)化Windows下串行通信編程而提供的ActiveX控件。它提供了一系列標(biāo)準(zhǔn)通信命令的使用接口,利用它可以建立與串口的連接,并可以通過串口連接到其他通信設(shè)備(如調(diào)制解調(diào)器),發(fā)出命令,交換數(shù)據(jù)以及監(jiān)視和響應(yīng)串行連接中發(fā)生的事件和錯(cuò)誤。MSCOMM控件可用于創(chuàng)建電話撥號(hào)程序、串口通信程序和功能完備的終端程序。

          串行通信控件MSComm32.OCX提供了使用RS-232來進(jìn)行數(shù)據(jù)通信的所有協(xié)議,VC編程語言為該控件提供了標(biāo)準(zhǔn)的事件處理函數(shù)、過程,并通過屬性和方法提供了串行通信的設(shè)置。它使用戶能夠方便地訪問Windows串行通信驅(qū)動(dòng)程序的大多數(shù)特性,包括輸入、輸出緩沖區(qū)的大小及決定何時(shí)使用流控制命令掛起數(shù)據(jù)傳輸?shù)取?/p>

          在ClassWizard中為新創(chuàng)建的通信控件定義成員對(duì)象(CMSComm m_Serial),通過該對(duì)象便可以對(duì)串口屬性進(jìn)行設(shè)置,MSComm控件共有27個(gè)屬性。如果需要通過多個(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 ();
          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
          }

          打開所需串口后,我們需要考慮串口通信的時(shí)機(jī)。在接收或發(fā)送數(shù)據(jù)過程中,可能需要監(jiān)視并響應(yīng)一些事件和錯(cuò)誤,所以事件驅(qū)動(dòng)是處理串行端口交互作用的一種非常有效的方法。使用OnComm事件和CommEvent屬性捕捉并檢查通信事件和錯(cuò)誤的值。發(fā)生通信事件或錯(cuò)誤時(shí)將觸發(fā)OnComm事件,CommEvent屬性的值將被改變,應(yīng)用程序通過檢查CommEvent屬性值并做出相應(yīng)的反應(yīng)。

          如圖1是機(jī)與多個(gè)連接的原理圖,圖2是其通信程序流程圖。

          1.3、使用API函數(shù)

          Windows 應(yīng)用程序要與標(biāo)準(zhǔn)串口通信,Windows函數(shù)庫(kù)中提供了24個(gè)低級(jí)函數(shù),這些函數(shù)為與外部設(shè)備的通信提供了基本的工具,文件輸入和文件輸出函數(shù)為通信資源句柄的打開、關(guān)閉以及執(zhí)行讀寫操作提供了基本的接口,Win32 API也包含一系列訪問通信資源的通信函數(shù),具體工作過程如下:首先打開一個(gè)通信資源句柄CreateFile(),接著進(jìn)行串行通信資源的配置(包括波特率、奇偶校驗(yàn)、停止位和數(shù)據(jù)位等信息),通過SetCommState()、GetCommState()進(jìn)行修改和查詢完成初始化設(shè)置;串行通信資源的讀寫通過ReadFile()、WriteFile()來完成收發(fā)數(shù)據(jù),監(jiān)視串行通信資源某些可能發(fā)生的事件可通過WaitCommEvent()來完成,向與某通信資源相關(guān)的設(shè)備驅(qū)動(dòng)程序發(fā)送控制命令,使驅(qū)動(dòng)程序執(zhí)行特定任務(wù)。

          控件雖然簡(jiǎn)單易用,但由于必須拿到對(duì)話框中使用,在一些需要在線程中實(shí)現(xiàn)通信的應(yīng)用場(chǎng)合下,控件的使用顯得捉襟見肘。API是附帶在Windows內(nèi)部的一個(gè)極其重要的組成部分。Windows的32位API主要是一系列很復(fù)雜的函數(shù)和消息集合。它可以看作是Windows系統(tǒng)為在其下運(yùn)行的各種開發(fā)系統(tǒng)提供的開放式通用功能增強(qiáng)接口。通信程序在CreateFile處指定串口設(shè)備及相關(guān)的操作屬性,再返回一個(gè)句柄,該句柄將被用于后續(xù)的通信操作,并貫穿整個(gè)通信過程。串口打開后,其屬性被設(shè)置為默認(rèn)值,根據(jù)具體需要,通過調(diào)用GetCommState(hComm,dcb)讀取當(dāng)前串口設(shè)備控制塊DCB設(shè)置,修改后通過 SetCommState(hComm,dcb)將其寫入。運(yùn)用ReadFile()與WriteFile()這兩個(gè)API函數(shù)實(shí)現(xiàn)串口讀寫操作,若為異步通信方式,兩函數(shù)中最后一個(gè)參數(shù)為指向OVERLAPPED結(jié)構(gòu)的非空指針,在讀寫函數(shù)返回值為FALSE的情況下,調(diào)用 GetLastError()函數(shù),返回值為ERROR_IO_PENDING,表明I/O操作懸掛,即操作轉(zhuǎn)入后臺(tái)繼續(xù)執(zhí)行。此時(shí),可以用 WaitForSingleObject()來等待結(jié)束信號(hào)并設(shè)置最長(zhǎng)等待時(shí)間,舉例如下:
          BOOL bReadStatus;
          bReadStatus = ReadFile (m_hIDComDev, buffer,
          dwBytesRead, dwBytesRead, m_OverlappedRead);
          if (! bReadStatus){
          if(GetLastError()==ERROR_IO_PENDING){
          WaitForSingleObject(m_OverlappedRead.hEvent,1000);
          return ((int)dwBytesRead);}
          return(0);}
          return ((int)dwBytesRead);

          1.4、多線程下的串行通信

          Windows內(nèi)部的搶先調(diào)度程序在活動(dòng)的線程之間分配CPU時(shí)間,Windows區(qū)分兩種不同類型的線程,一種是用戶界面線程(User Interface Thread),它包含消息循環(huán)或消息泵,用于處理接收到的消息;另一種是工作線程(Work Thread),它沒有消息循環(huán),用于執(zhí)行后臺(tái)任務(wù)、監(jiān)視串口事件的線程即為工作線程。多線程程序的編寫在端口的配置、連接部分與單線程的相同,在端口配置完畢后,最重要的是根據(jù)實(shí)際情況,建立多線程之間的同步對(duì)象,如信號(hào)燈、臨界區(qū)和事件等。多線程的實(shí)現(xiàn)可以使得各端口獨(dú)立,準(zhǔn)確地實(shí)現(xiàn)串行通信,使串行通信具有更廣泛的靈活性與嚴(yán)格性,且充分利用CPU時(shí)間。但在具體的實(shí)時(shí)監(jiān)控系統(tǒng)中如何協(xié)調(diào)多個(gè)線程、線程之間以何種方式實(shí)現(xiàn)同步,這是多線程串行通信程序?qū)崿F(xiàn)的難點(diǎn)。

          數(shù)字通信相關(guān)文章:數(shù)字通信原理


          通信相關(guān)文章:通信原理



          上一頁 1 2 下一頁

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();