1. <code id="ya7qu"><span id="ya7qu"><label id="ya7qu"></label></span></code>

    <b id="ya7qu"><bdo id="ya7qu"></bdo></b>
    <wbr id="ya7qu"><optgroup id="ya7qu"><strike id="ya7qu"></strike></optgroup></wbr>
  2. <u id="ya7qu"><bdo id="ya7qu"></bdo></u>
    現在位置:范文先生網>理工論文>電子通信論文>用PComm開發PC機與單片機的通信程序

    用PComm開發PC機與單片機的通信程序

    時間:2023-02-21 00:10:47 電子通信論文 我要投稿
    • 相關推薦

    用PComm開發PC機與單片機的通信程序

      摘要:介紹了分布式控制系統中上位PC機與下位單片機異步串行通信的通信協議;同時介紹了在VC++6.0環境下用PComm編寫的PC機通信程序來實現上位機和下位機異步串行通信的方法,給出了PComm編程實例和下位機程序模塊流程圖。
      關鍵詞:分布式控制系統;異步;串行通信;PComm
      
      在由一臺PC機(上位機)和多臺單片機(下位機)構成的分布式控制系統中,單片機主要負責實時數據采集,并將初步處理后的數據通過串行口傳送給PC機?以便由PC機串行口的命令對單片機進行控制,同時通過打印機或顯示器向用戶隨時提供各種統計報表和整個控制過程的具體數據。在這樣的分布式控制系統中,單片機與微機之間的多路通信是整個系統的關鍵,本文將介紹在提高通信的準確性、可靠性和效率的前提下,用PComm開發PC機與單片機的通信程序的解決方案。
      
      1通信協議
      
      為了保證可靠的通信,必須有一套完善的通信協議。分布式控制系統中的每臺單片機均有唯一的番號。通信開始時,先由PC機呼叫被叫單片機的番號,單片機在接收到微機的呼叫后,首先判斷是不是自己的番號,如果是,則發送呼叫應答信號,否則不予理睬。微機在接收到呼叫應答信號之后,將向單片機發出通信命令字符串。以下是上位PC機協議的格式:
      
      單片機號單片機號命令碼命令碼停止標志
      其中,單片機號代表現場第幾臺單片機,占用1個字節,發送兩次的目的是為了防止干擾;命令碼則代表上位機向下位機發布的工作命令,它也占用1個字節,發送兩次的目的也是為了防止干擾。而停止標志則表明一次命令發送完畢。使用時可依據該標志判斷上位機的命令是否發送完畢。
      
      下位機協議格式如下:
      
      數據塊校驗位
      該格式中,數據塊為下位機上傳到上位PC機的數據。校驗位則用于PC機對收到的數據進行奇偶校驗(占1個字節)。校驗正確后,可將數據寫入內存,否則發出數據傳輸錯誤信息,以要求單片機重新傳輸數據。
      
      另外,作為一個完整的通信協議,只有上述約定還不夠,還必須在發送和接收數據的時間間隔上加以限制。否則,很可能由于某些原因而造成無限制的等待對方應答,使整個系統處于工作不正常狀態,或者延誤其它動作的處理。具體時間限制可根據通信內容、CPU處理速度,再加上適當的余量來確定。
      
      2單片機通信程序設計
      
      設計單片機通信程序時,必須充分發揮單片機的效率。由于單片機多應用于實時性較強的控制場合,因此,應將及時響應和控制對象的動作放在優先考慮的位置,以盡量減少通信等輔助性操作所占用的CPU時間。基于上述考慮,筆者在設計單片機通信程序時,將通信程序分為接收中斷處理程序、發送中斷處理程序和通信處理程序3部分,并將這3部分程序巧妙地進行組合,從而構成整個單片機的通信程序。
      
      2.1接收中斷處理程序
      
      接收中斷處理程序主要負責接收微機發送到單片機接收緩沖區(不對數據進行處理,以減少中斷占用的時間)的數據,當接收到規定的字符數或在一定等待時間內無后續數據之后,置接收完畢標志,以表明接收緩沖區中有待處理的數據并請求通信處理程序對其進行處理。其流程圖如圖1所示。
      
      2.2發送中斷處理程序
      
      發送中斷處理程序主要負責向微機發送數據,發送中斷一般處于禁止狀態,只有在通信處理程序將需要發送的數據寫入單片機的發送緩沖區,并將發送中斷置為允許方式后,發送中斷才開始工作,并將緩沖區數據逐一發送給微機。當發送完指定長度的數據后(發送緩沖區為空),發送中斷處理程序將發送中斷置為禁止(關閉)狀態,直到通信處理程序將其再一次開放。其流程如圖2所示。
      
      2.3通信處理程序
      
      考慮到盡量減少通信中斷程序所占用的CPU時間,通信處理程序被放在普通主循環中調用。只有在接收到上位機送來的一串數據,且接收完畢標志為“ON”時,才能真正進行處理,否則不進行處理。這樣就可利用送信后等待微機回答的時間進行別的處理,從而消除了空等待時間,提高了CPU的利用率。通信處理程序可根據通信處理狀態的不同來分別執行不同的路徑。在進入相應路徑后,首先對接收緩沖區的內容進行正確性檢查,檢查正確后再根據通信要求或協議規定對緩沖區的內容進行處理(包括內存的寫入和讀出),同時重新組織數據到發送緩沖區以向微機發送數據,最后退出通信處理程序以執行其它的程序。待接收中斷程序重新接收到數據并將接收完標志置為“ON”后,可重新進入通信處理程序進行處理。
      
      3PC機通信程序設計
      
      在VC++6.0環境下,利用PC機串口進行通信的常用方法有兩種?第一是調用WindowsAPI?Appli-cationProgramInterface?函數;第二是使用ActiveX的MSComm控件。第一種方法需聲明及調用許多API函數,十分煩瑣。而第二種方法是將API函數封裝起來,這種方法雖較為簡便,但不能滿足復雜情況下的通信要求。本文將介紹另外一種用PComm處理PC機的串口通信方法。
      
      PComm是一種用于處理多進程/多線程的串口通信軟件開發工具,它提供了許多基于API函數的命令集來處理串口通信,可以在VisualC++、VisualBasic、Delphi5.0等多種開發工具下使用,且具有傳輸速度快、使用靈活方便等特點,能夠滿足復雜情況下的串口通信要求。
      
      3.1Pcomm的主要命令碼
      
      PComm的主要命令碼有以下幾種:
      
      ●sioopen(port);
      
      用于設置并打開串口,其中port的1、2、3、4分別代表COM1、COM2、COM3、COM4。當返回值為0時,表示串口已經打開,否則為串口打開出錯。
      
      ●sioclose(port);
      
      關閉串口,當返回值為0時,表示串口已經關閉,否則為串口關閉出錯。
      
      ●sioioctl(port?baud?mode);
      
      用于設置串口波特率、校驗位、數據位、停止位等參數。
      
      ●siogetch();
      
      從串口輸入緩沖區讀出一個字符,返回值為0表示已收到數據。
      
      ●sio-read(port?buf?len);
      
      用于從串口輸入緩沖區讀出一串字符,buf代表字符串數組len代表數組長度,返回值為0表示未收到字符,大于0代表收到字符的個數。
      
      ●sio-SetReadTimeouts?port?TotalTimeouts(Inter-valTimeouts);
      
      在設定的等待時間內連續讀串口輸入緩沖區,TotalTimeouts代表設定的等待時間,IntervalTimeouts代表每次讀出的間隔時間。
      
      ●sio-flush(port?func);
      
      用于清空緩沖區。當func為0時清空輸入緩沖區,為1時清空輸出緩沖區,為2時清空輸入輸出緩沖區。
      
      ●sio-putch(port?term);
      
      用于向串口緩沖區發送一個字符,返回值為0時表示發送正確,否則表示發送錯誤。
      
      ●sio-write(port?buf?len);
      
      用于從串口緩沖區發送一串字符,buf代表字符串數組,len代表數組長度。
      
      3.2實現過程
      
      在用Pcomm處理PC機的串口通信時,其實現過程如下:
      
      (1)啟動VC++6.0,新建一個基于對話框的應用程序TxRx。同時增加靜態文本、編輯框和按鈕控件,并為它們添加相應的變量。其屬性見表1。
      
      表1TxRx應用程序的屬性
      
      控件ID變量名類型按鈕IDC_TRSMITT發送按鈕EditIDC_TXDATAM_TxDataCstringEditIDC_RXDATAM_RxDataCstring
      (2)將Pcomm.h和Pcomm.lib加入到工程中,并在TxRxDlg.cpp文件中加入#include“Pcomm.h”頭文件,此后便可調用其提供的通信命令集。
      
      (3)在TxRxDlg.cpp文件中添加有關程序代碼,也就是在OnInitiDialog??函數中的TODO語句后加入以下代碼:
      
      //TODO?Addextrainitializationhere
      
      intret?port=1?
      
      ret=sioopen?port??//打開串口1
      
      sioDTR?port?0??//置DTR為低電平
      
      sioioctl?port?B19200?PNONE|BIT8|STOP1??//設置波特率為19200,8位數據位,
      
      1位停止位,無校驗位。
      
      3.3數據通信
      
      下面舉例說明PC機如何通過串口向單片機發送并接收數據。
      
      voidCTXRXDlg??SendRecv??//收發數據子函數
      
      {
      
      while?1?
      
      {
      
      intret1?
      
      sioflush?port?2;//清空串口輸入輸出緩沖區
      
      sio-write(port,1,5);
      
      向串口緩沖區發送5個字符
      
      sio-SetReadTimeouts(port,40,1);
      
      //在40ms內每隔1ms讀一次串口
      
      ret1=sio-read(port,RecvBuf,1);
      
      if(ret1>0)
      
      {
      
      sio-close(port);
      
      break;
      
      }
      
      //若收到數據,關閉串口,跳出循環
      
      else;
      
      //若未收到數據,對串口再一次發數據并再次查詢接收。
      
      }
      
      }
      
      4結束語
      
      本文給出了分布式控制系統中上位PC機與下位單片機之間進行異步串行通信的解決方案。此方案在實際運行過程中,運行穩定,通信性能良好,從而較好地解決了上位機與下位機之間的通信問題。
      
      
      
      

    【用PComm開發PC機與單片機的通信程序】相關文章:

    利用VB實現PC機與多單片機通訊08-06

    用CPLD實現單片機與ISA總線接口的并行通信08-06

    用TL16C752B實現DSP和PC機的串行通信08-06

    用PICC編譯器開發PIC系列單片機的代碼08-06

    單片機通信性能分析和評價方法08-06

    使用MAC平臺的非線性編輯設備與PC機通信的握手及應用08-06

    用CPLD實現單片機讀寫模塊08-06

    ECP協議及在SX52BD與PC機間通信的實現08-06

    C8051FXXX單片機FLASH程序的自動升級08-06

    国产福利萌白酱精品tv一区_日韩亚洲中字无码一区二区三区_亚洲欧洲高清无码在线_全黄无码免费一级毛片
    1. <code id="ya7qu"><span id="ya7qu"><label id="ya7qu"></label></span></code>

      <b id="ya7qu"><bdo id="ya7qu"></bdo></b>
      <wbr id="ya7qu"><optgroup id="ya7qu"><strike id="ya7qu"></strike></optgroup></wbr>
    2. <u id="ya7qu"><bdo id="ya7qu"></bdo></u>
      中文字幕在线精品乱码 | 性高朝久久久久久久 | 亚洲乱理片在线观看中字 | 中文字幕v亚洲日本电影 | 中文有码在线视频 | 午夜福利国产小视频在线 |