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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > PC機(jī)與下位單片機(jī)異步串行通信

          PC機(jī)與下位單片機(jī)異步串行通信

          作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
          在由一臺PC機(jī)(上位機(jī))和多臺單片機(jī)(下位機(jī))構(gòu)成的分布式控制系統(tǒng)中,單片機(jī)主要負(fù)責(zé)實(shí)時數(shù)據(jù)采集,并將初步處理后的數(shù)據(jù)通過串行口傳送給PC機(jī)以便由PC機(jī)串行口的命令對單片機(jī)進(jìn)行控制,同時通過打印機(jī)或顯示器向用戶隨時提供各種統(tǒng)計報表和整個控制過程的具體數(shù)據(jù)。在這樣的分布式控制系統(tǒng)中,單片機(jī)與微機(jī)之間的多路通信是整個系統(tǒng)的關(guān)鍵,本文將介紹在提高通信的準(zhǔn)確性、可靠性和效率的前提下,用PComm開發(fā)PC機(jī)與單片機(jī)的通信程序的解決方案。

          1 通信協(xié)議
          為了保證可靠的通信,必須有一套完善的通信協(xié)議。分布式控制系統(tǒng)中的每臺單片機(jī)均有唯一的番號。通信開始時,先由PC機(jī)呼叫被叫單片機(jī)的番號,單片機(jī)在接收到微機(jī)的呼叫后,首先判斷是不是自己的番號,如果是,則發(fā)送呼叫應(yīng)答信號,否則不予理睬。微機(jī)在接收到呼叫應(yīng)答信號之后,將向單片機(jī)發(fā)出通信命令字符串。以下是上位PC機(jī)協(xié)議的格式:
          單片機(jī)號單片機(jī)號命令碼命令碼停止標(biāo)志 
          其中,單片機(jī)號代表現(xiàn)場第幾臺單片機(jī),占用1個字節(jié),發(fā)送兩次的目的是為了防止干擾;命令碼則代表上位機(jī)向下位機(jī)發(fā)布的工作命令,它也占用1個字節(jié),發(fā)送兩次的目的也是為了防止干擾。而停止標(biāo)志則表明一次命令發(fā)送完畢。使用時可依據(jù)該標(biāo)志判斷上位機(jī)的命令是否發(fā)送完畢。
          下位機(jī)協(xié)議格式如下:
          數(shù)據(jù)塊校驗(yàn)位
          該格式中,數(shù)據(jù)塊為下位機(jī)上傳到上位PC機(jī)的數(shù)據(jù)。校驗(yàn)位則用于PC機(jī)對收到的數(shù)據(jù)進(jìn)行奇偶校驗(yàn)(占1個字節(jié))。校驗(yàn)正確后,可將數(shù)據(jù)寫入內(nèi)存,否則發(fā)出數(shù)據(jù)傳輸錯誤信息,以要求單片機(jī)重新傳輸數(shù)據(jù)。
          另外,作為一個完整的通信協(xié)議,只有上述約定還不夠,還必須在發(fā)送和接收數(shù)據(jù)的時間間隔上加以限制。否則,很可能由于某些原因而造成無限制的等待對方應(yīng)答,使整個系統(tǒng)處于工作不正常狀態(tài),或者延誤其它動作的處理。具體時間限制可根據(jù)通信內(nèi)容、CPU處理速度,再加上適當(dāng)?shù)挠嗔縼泶_定。

          2 單片機(jī)通信程序設(shè)計
          設(shè)計單片機(jī)通信程序時,必須充分發(fā)揮單片機(jī)的效率。由于單片機(jī)多應(yīng)用于實(shí)時性較強(qiáng)的控制場合,因此,應(yīng)將及時響應(yīng)和控制對象的動作放在優(yōu)先考慮的位置,以盡量減少通信等輔助性操作所占用的CPU時間?;谏鲜隹紤],筆者在設(shè)計單片機(jī)通信程序時,將通信程序分為接收中斷處理程序、發(fā)送中斷處理程序和通信處理程序3部分,并將這3部分程序巧妙地進(jìn)行組合,從而構(gòu)成整個單片機(jī)的通信程序。
          2.1 接收中斷處理程序
          接收中斷處理程序主要負(fù)責(zé)接收微機(jī)發(fā)送到單片機(jī)接收緩沖區(qū)(不對數(shù)據(jù)進(jìn)行處理,以減少中斷占用的時間)的數(shù)據(jù),當(dāng)接收到規(guī)定的字符數(shù)或在一定等待時間內(nèi)無后續(xù)數(shù)據(jù)之后,置接收完畢標(biāo)志,以表明接收緩沖區(qū)中有待處理的數(shù)據(jù)并請求通信處理程序?qū)ζ溥M(jìn)行處理。其流程圖如圖1所示。
          2.2 發(fā)送中斷處理程序
          發(fā)送中斷處理程序主要負(fù)責(zé)向微機(jī)發(fā)送數(shù)據(jù),發(fā)送中斷一般處于禁止?fàn)顟B(tài),只有在通信處理程序?qū)⑿枰l(fā)送的數(shù)據(jù)寫入單片機(jī)的發(fā)送緩沖區(qū),并將發(fā)送中斷置為允許方式后,發(fā)送中斷才開始工作,并將緩沖區(qū)數(shù)據(jù)逐一發(fā)送給微機(jī)。當(dāng)發(fā)送完指定長度的數(shù)據(jù)后(發(fā)送緩沖區(qū)為空),發(fā)送中斷處理程序?qū)l(fā)送中斷置為禁止(關(guān)閉)狀態(tài),直到通信處理程序?qū)⑵湓僖淮伍_放。其流程如圖2所示。
          2.3 通信處理程序
          考慮到盡量減少通信中斷程序所占用的CPU時間,通信處理程序被放在普通主循環(huán)中調(diào)用。只有在接收到上位機(jī)送來的一串?dāng)?shù)據(jù),且接收完畢標(biāo)志為“ON”時,才能真正進(jìn)行處理,否則不進(jìn)行處理。這樣就可利用送信后等待微機(jī)回答的時間進(jìn)行別的處理,從而消除了空等待時間,提高了CPU的利用率。通信處理程序可根據(jù)通信處理狀態(tài)的不同來分別執(zhí)行不同的路徑。在進(jìn)入相應(yīng)路徑后,首先對接收緩沖區(qū)的內(nèi)容進(jìn)行正確性檢查,檢查正確后再根據(jù)通信要求或協(xié)議規(guī)定對緩沖區(qū)的內(nèi)容進(jìn)行處理(包括內(nèi)存的寫入和讀出),同時重新組織數(shù)據(jù)到發(fā)送緩沖區(qū)以向微機(jī)發(fā)送數(shù)據(jù),最后退出通信處理程序以執(zhí)行其它的程序。待接收中斷程序重新接收到數(shù)據(jù)并將接收完標(biāo)志置為“ON”后,可重新進(jìn)入通信處理程序進(jìn)行處理。

          3 PC機(jī)通信程序設(shè)計
          在VC++6.0環(huán)境下,利用PC機(jī)串口進(jìn)行通信的常用方法有兩種第一是調(diào)用Windows APIAppli- cation Program Interface函數(shù);第二是使用ActiveX的MSComm控件。第一種方法需聲明及調(diào)用許多API函數(shù),十分煩瑣。而第二種方法是將API函數(shù)封裝起來,這種方法雖較為簡便,但不能滿足復(fù)雜情況下的通信要求。本文將介紹另外一種用PComm處理PC機(jī)的串口通信方法。
          PComm是一種用于處理多進(jìn)程/多線程的串口通信軟件開發(fā)工具,它提供了許多基于API函數(shù)的命令集來處理串口通信,可以在Visual C++、Visual Basic、Delphi 5.0等多種開發(fā)工具下使用,且具有傳輸速度快、使用靈活方便等特點(diǎn),能夠滿足復(fù)雜情況下的串口通信要求。
          3.1 Pcomm的主要命令碼
          PComm的主要命令碼有以下幾種:
          ● sio open(port);
          用于設(shè)置并打開串口,其中port的1、2、3、4分別代表COM1、COM2、COM3、COM4。當(dāng)返回值為0時,表示串口已經(jīng)打開,否則為串口打開出錯。
          ● sio close(port);
          關(guān)閉串口,當(dāng)返回值為0時,表示串口已經(jīng)關(guān)閉,否則為串口關(guān)閉出錯。
          ● sio ioctl(portbaudmode);
          用于設(shè)置串口波特率、校驗(yàn)位、數(shù)據(jù)位、停止位等參數(shù)。
          ● sio getch();
          從串口輸入緩沖區(qū)讀出一個字符,返回值為0表示已收到數(shù)據(jù)。
          ● sio-read(portbuflen);
          用于從串口輸入緩沖區(qū)讀出一串字符,buf代表字符串?dāng)?shù)組len代表數(shù)組長度,返回值為0表示未收到字符,大于0代表收到字符的個數(shù)。
          ● sio-SetReadTimeoutsportTotalTimeouts(Inter-valTimeouts);
          在設(shè)定的等待時間內(nèi)連續(xù)讀串口輸入緩沖區(qū),TotalTimeouts代表設(shè)定的等待時間,IntervalTimeouts代表每次讀出的間隔時間。
          ● sio-flush(portfunc);
          用于清空緩沖區(qū)。當(dāng)func為0時清空輸入緩沖區(qū),為1時清空輸出緩沖區(qū),為2時清空輸入輸出緩沖區(qū)。
          ● sio-putch(portterm);
          用于向串口緩沖區(qū)發(fā)送一個字符,返回值為0時表示發(fā)送正確,否則表示發(fā)送錯誤。
          ● sio-write(portbuflen);
          用于從串口緩沖區(qū)發(fā)送一串字符,buf代表字符串?dāng)?shù)組,len代表數(shù)組長度。
          3.2 實(shí)現(xiàn)過程
          在用Pcomm處理PC機(jī)的串口通信時,其實(shí)現(xiàn)過程如下:
          (1)啟動VC++ 6.0,新建一個基于對話框的應(yīng)用程序TxRx。同時增加靜態(tài)文本、編輯框和按鈕控件,并為它們添加相應(yīng)的變量。其屬性見表1。

          表1 TxRx應(yīng)用程序的屬性
          控 件ID變量名類 型
          按 鈕IDC_TRSMITT發(fā)送按鈕 
          EditIDC_TXDATAM_TxDataCstring
          EditIDC_RXDATAM_RxDataCstring
          (2) 將Pcomm.h和Pcomm.lib加入到工程中,并在TxRxDlg.cpp文件中加入#include “Pcomm.h”頭文件,此后便可調(diào)用其提供的通信命令集。
          (3)在TxRxDlg.cpp文件中添加有關(guān)程序代碼,也就是在OnInitiDialog函數(shù)中的TODO語句后加入以下代碼:
          //TODO Add extra initialization here
          int retport=1
          ret=sio openport //打開串口1
          sio DTRport0 //置DTR為低電平
          sio ioctlportB19200P NONE|BIT 8| STOP 1 //設(shè)置波特率為19200,8位數(shù)據(jù)位,
          1位停止位,無校驗(yàn)位。
          3.3 數(shù)據(jù)通信
          下面舉例說明PC機(jī)如何通過串口向單片機(jī)發(fā)送并接收數(shù)據(jù)。
          void CTXRXDlgSendRecv//收發(fā)數(shù)據(jù)子函數(shù)
          {
          while1
          {
          int ret1
          sio flushport2;//清空串口輸入輸出緩沖區(qū)
          sio- write(port,1,5);
          向串口緩沖區(qū)發(fā)送5個字符
          sio- SetReadTimeouts(port,40,1);
          //在40ms內(nèi)每隔1ms讀一次串口
          ret1=sio-read(port,RecvBuf,1);
          if (ret1>0)
          {
          sio- close(port);
          break;
          }
          //若收到數(shù)據(jù),關(guān)閉串口,跳出循環(huán)
          else;
          //若未收到數(shù)據(jù),對串口再一次發(fā)數(shù)據(jù)并再次查詢接收。
          }
          }
          4 結(jié)束語
          本文給出了分布式控制系統(tǒng)中上位PC機(jī)與下位單片機(jī)之間進(jìn)行異步串行通信的解決方案。此方案在實(shí)際運(yùn)行過程中,運(yùn)行穩(wěn)定,通信性能良好,從而較好地解決了上位機(jī)與下位機(jī)之間的通信問題。


          評論


          技術(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); })();