999国内精品永久免费视频,色偷偷9999www,亚洲国产成人爱av在线播放,6080亚洲人久久精品,欧美超高清xxxhd

Visual C++在異步串行通信控制中的應(yīng)用

邱紅兵 韓峰

  摘要:系統(tǒng)介紹了Visual C++實(shí)現(xiàn)異步串行通信的基本原理,分別講述了用Windows函數(shù)庫API函數(shù)實(shí)現(xiàn)和C運(yùn)行時(shí)庫的實(shí)現(xiàn)方法,以及在控制系統(tǒng)中的編程應(yīng)用實(shí)例。
  關(guān)鍵詞:控制系統(tǒng);串行通信;Visual C++應(yīng)用
  中圖分類號(hào):TP311.11     文獻(xiàn)標(biāo)識(shí)碼:A

The Visual C++ Application in Asynchronous Serial Communication Control

QIU Hong-bing   HAN feng

  Abstract: The paper is focus on the principle of asynchronous serial communication by Visual C++, and tells of their implement methods using API function in Windows function warehouse and C function singly. The paper also adduces program application sample in control system.
  Key Words: control system;serial communication;Visual C++ application

1 引言
  Visual C++是建立在Window 95和Window NT 32位程序上的可視化編程環(huán)境,對(duì)于控制系統(tǒng)的可視化開發(fā)提供了極大的便利,但是對(duì)于計(jì)算機(jī)控制系統(tǒng)中數(shù)據(jù)采集、控制,用Visual C++實(shí)現(xiàn)的介紹卻很少;诖,介紹Visual C++在測(cè)控系統(tǒng)應(yīng)用中的基本原理及應(yīng)用,其中異步串行通信是關(guān)鍵。其基本構(gòu)成是:下位機(jī)(單片機(jī)系統(tǒng))完成信號(hào)檢測(cè)、A/D轉(zhuǎn)換和簡(jiǎn)單的控制功能,通過系統(tǒng)總線(如RS-232C)與上位機(jī)(PC機(jī))相連,進(jìn)行監(jiān)測(cè)、控制,形成主從式結(jié)構(gòu)。

2 工作原理
  通過傳感器檢測(cè)得到被控信號(hào)及相關(guān)信號(hào),經(jīng)過放大、濾波處理形成有效信號(hào),通過A/D轉(zhuǎn)換形成數(shù)字信號(hào),輸入到單片機(jī)系統(tǒng)進(jìn)行處理。其中單片機(jī)系統(tǒng)完成相應(yīng)算法或控制功能;PC機(jī)主要完成監(jiān)視、控制其下面的單片機(jī)系統(tǒng),進(jìn)行集中管理。它們之間的通信可通過RS-232C標(biāo)準(zhǔn)總線進(jìn)行異步傳輸。系統(tǒng)結(jié)構(gòu)如圖1所示。

16-1.gif (6133 bytes)

圖1 控制系統(tǒng)網(wǎng)絡(luò)結(jié)構(gòu)圖

3 Visual C++實(shí)現(xiàn)串行通信
  Visual C++實(shí)現(xiàn)串行通信有幾種方式可供選擇,如利用計(jì)算機(jī)上的標(biāo)準(zhǔn)串行口進(jìn)行,或自制專用卡插入工控機(jī)的PCI總線的ISA擴(kuò)展槽等。下面主要論述利用計(jì)算機(jī)上的標(biāo)準(zhǔn)串行口進(jìn)行串行通信,可分為利用Windows函數(shù)庫API函數(shù)和利用C運(yùn)行時(shí)庫實(shí)現(xiàn)。其中API函數(shù)主要以創(chuàng)建資源的形式進(jìn)行串行通信,C運(yùn)行時(shí)庫采用類似C的方式進(jìn)行。
3.1 API函數(shù)實(shí)現(xiàn)
  Windows應(yīng)用程序要與標(biāo)準(zhǔn)串口通信,Windows函數(shù)庫中提供了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ù)。對(duì)于具體參數(shù)設(shè)置可參閱有關(guān)書籍。[1]
3.2 C運(yùn)行時(shí)庫實(shí)現(xiàn)
  對(duì)于利用C運(yùn)行時(shí)庫實(shí)現(xiàn)串行通信在此將詳細(xì)進(jìn)行討論。它與硬件密切相關(guān),其核心器件是通用異步接收發(fā)送器(簡(jiǎn)稱UART),并在機(jī)箱后部外引一個(gè)25腳(或15腳、9腳)的D型連接器作為數(shù)據(jù)終端設(shè)備(DTE)一側(cè),它通過異步通信電纜(RS-232)與另一側(cè)數(shù)據(jù)通信設(shè)備(DCE)(MODEM或其它通信設(shè)備)相連。
3.2.1 RS-232異步串行口連接
  異步串行通信對(duì)應(yīng)用接口極其敏感,常用的RS-232C接口有MODEM接口標(biāo)準(zhǔn)連接和零MODEM的非標(biāo)準(zhǔn)連接,但在實(shí)際應(yīng)用中,并非需要全部控制信號(hào)線,而且在某種場(chǎng)合下,還允許采取若干種非標(biāo)準(zhǔn)的連接方式,如圖2所示。其中圖2a主要適用于長(zhǎng)距離串行通信,而圖2b適用于短距離異步通信,無需MODEM這類DCE設(shè)備介入。

16-2.gif (9253 bytes)

圖2 RS-232接口連接

3.2.2 異步串行通信原理
  利用C進(jìn)行異步通信編程,其實(shí)是對(duì)UART內(nèi)部寄存器的讀出或?qū)懭氩僮。VC可利用-inp()/-outp()函數(shù)對(duì)其進(jìn)行編程,它們的端口地址列于表1。

表1 UART內(nèi)部寄存器端口分配

端口地址** 指令 條件* 寄存器名稱及作用
0x3f8(0x2f8)
0x3f8(0x2f8)
0x3f8(0x2f8)
0x3f9(0x2f9)
0x3f9(0x2f9)
0x3fa(0x2fa)
0x3fb(0x2fb)
0x3fc(0x2fc)
0x3fd(0x2fd)
0x3fe(0x2fe)
_outp
_inp
_outp
_outp
_outp
_inp
_outp
_outp
_inp
_inp
DLAB=0
DLAB=0
DLAB=1
DLAB=1
DLAB=0




寫入發(fā)送器保持寄存器
讀出接收器數(shù)據(jù)寄存器
寫入波特率因子(LSB)
寫入波特率因子(MSB)
寫入中斷允許寄存器
讀出中斷標(biāo)識(shí)寄存器
寫入線路控制寄存器
寫入MODEM控制寄存器
讀出線路狀態(tài)寄存器
讀出MODEM狀態(tài)寄存器

  * DLAB指線路控制器 D7位;
  ** 括號(hào)前指COM1,括號(hào)內(nèi)指COM2。

  下面,從編程應(yīng)用的順序考慮,對(duì)表1各個(gè)寄存器的作用進(jìn)行說明(端口地址以COM1為例)。
  首先確定異步通信的數(shù)據(jù)格式,包括波特率因子的鎖存,奇偶校驗(yàn)位的設(shè)定,停止位數(shù)和數(shù)據(jù)位數(shù)的確定,各位定義如下:D7置1對(duì)除數(shù)鎖存,D6置1允許間斷,D5D4D3奇偶位,D2停止位數(shù),D1D0數(shù)據(jù)位數(shù)。
  接著確定通信雙方傳輸波特率,確定波特率的方法是在通信前,將波特率因子(16位)分兩次寫入到波特率因子寄存器,波特率與波特率因子的關(guān)系舉例:如波特率為75,其波特率因子為0x06(MSB),0x00(LSB);波特率為1200,其波特率因子為0x00(MSB),0x60(LSB);1800對(duì)應(yīng)0x00(LSB),0x40(MSB);2400對(duì)應(yīng)0x00(LSB),0x30(MSB);3600對(duì)應(yīng)0x00(LSB),0x20(MSB);9600對(duì)應(yīng)0x00(LSB),0x0C(MSB)等等。
  緊接著是讀取線路狀態(tài)判斷,適用于URAT的查詢I/O,若采取中斷I/O,不需判斷。對(duì)URAT采取查詢I/O方式,首先要讀取線路狀態(tài),以判斷是否就緒并用于發(fā)送或接收。存在UART內(nèi)部狀態(tài)的線路狀態(tài)寄存器的各位定義如下:D7恒0,D6發(fā)送移位寄存器為空,D5發(fā)送保持寄存器為空,D4 接收到間斷條件,D3接收到幀格式錯(cuò),D2接收到奇偶校驗(yàn)錯(cuò),D1接收到超越錯(cuò),D0接收器數(shù)據(jù)就緒。
  然后進(jìn)行判斷。確定芯片操作方式和控制MODEM可通過對(duì)MODEM控制寄存器的寫入操作完成。[2]
3.2.3 應(yīng)用實(shí)例
  VC對(duì)異步串行通信編程應(yīng)用實(shí)例。主控計(jì)算機(jī)主要完成對(duì)其下的單片機(jī)系統(tǒng)的數(shù)據(jù)收集、處理控制和報(bào)警功能?刂葡到y(tǒng)結(jié)構(gòu)圖如圖1所示。對(duì)于控制軟件的串行通信有以下部分組成:串行口的初始化、數(shù)據(jù)收集處理和控制報(bào)警等部分(以串行口COM1為例,端口基址0x3f8)。
  初始化串行通信口一般做以下幾件事:確定數(shù)據(jù)傳輸幀格式(包括數(shù)據(jù)位長(zhǎng)度、停止位長(zhǎng)度及奇偶有無和類型選擇)、確定傳輸波特率(與數(shù)據(jù)信號(hào)傳輸率同值)以及確定UART操作方式。操作方式指正常通信或循環(huán)反饋用于診斷,是程序查詢I/O還是通信中斷I/O。
void CCommu::Init() {
  _outp(0x3fb,0x80);//設(shè)置線路控制寄存器置DLAB=1進(jìn)行設(shè)定波特率
  _outp(0x3f8,0x30);//寫入波特率因子,波特率為2400
  _outp(0x3f9,0x00);
  _outp(0x3fb,0x03);//設(shè)置線路控制寄存器置DLAB=0確定數(shù)據(jù)幀傳輸格式
  _outp(0x3f9,0x00);//設(shè)置中斷允許寄存器采用查詢I/O
  }
  數(shù)據(jù)收集處理主要完成數(shù)據(jù)接收發(fā)送。在收發(fā)過程中必須檢測(cè)MODEM狀態(tài)寄存器和線路狀態(tài)寄存器。通信流程如圖3所示:圖3a為發(fā)送流程,圖3b為接收流程。部分程序如下:

16-3a.gif (7518 bytes)16-3b.gif (7049 bytes)

圖3 查詢I/O方式下通信流程圖

BOOL CCommu::WaitForStatus(int flag)
{ //When flag is 1,send else receive
  int statusflag,j1=0,j2=0;
  BOOL TimeOverFlag=FALSE;
  do{
  statusflag=(int)_inp(0x3fd);
  if(flag==1){
  statusflag=statusflag&0x20;
  if(statusflag!=0){break;}
  }
  else{
  j1++;
  statusflag=statusflag&0x01;
  if(statusflag!=0){break;}
  else{
  if(j1 % 5000==0){j2++;j1=0;}  } if(j2>60){TimeOverFlag=TRUE;break;}
  }
  }while(1);
  return TimeOverFlag;
}

void Ccommu::SendData(int data)
{_outp(0x3f8,data);}

_int8 Ccommu::ReceData()
{return (_int8)_inp(0x3f8);
  對(duì)于控制、報(bào)警可根據(jù)具體要求確定。一般可采取主控計(jì)算機(jī)集中控制集中報(bào)警的方式,或從單片機(jī)系統(tǒng)自主控制主計(jì)算機(jī)集中管理報(bào)警的方式。對(duì)于數(shù)據(jù)的收發(fā)過程按上述原則進(jìn)行,在此不在詳述。

4 結(jié)束語
  本文介紹的Visual C++實(shí)現(xiàn)異步串行通信用于電力系統(tǒng)電纜故障在線監(jiān)測(cè)系統(tǒng)中運(yùn)行良好;對(duì)于控制系統(tǒng)的可視化、網(wǎng)絡(luò)化開發(fā)有參考意義。

作者簡(jiǎn)介:邱紅兵(1974-),男,湖北云夢(mèng)縣人,碩士研究生,主要從事數(shù)學(xué)模型建立、微機(jī)應(yīng)用軟件開發(fā)、機(jī)電控制及自動(dòng)化研究。
作者單位:北京理工大學(xué) 機(jī)電工程系,北京 100081

參考文獻(xiàn)
[1]穆宗學(xué),章江,肖蓉.Visual C++ 4.2編程實(shí)踐指要[M]. 北京:中國(guó)鐵道出版社,1997. 160-169.
[2]高登芳,潘承武,朱英杰.微型計(jì)算機(jī)實(shí)用測(cè)控接口技術(shù)[M]. 北京:北京科學(xué)技術(shù)出版社,1990. 214-224.