国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
利用Win32API開發(fā)串行通信程序
1、概述

  在工業(yè)控制中,串口是常用的計算機與外部串行設備之間的數據傳輸通道。由于串行通信結構簡單、可靠性強、實現及使用成本低、通訊標準統(tǒng)一,因此在測控系統(tǒng)和工程中應用十分廣泛。目前Windows在工業(yè)生產監(jiān)控管理系統(tǒng)中已成為主流平臺 ,Windows環(huán)境下的上、下位機之間的串行通信是設計與開發(fā)監(jiān)控管理系統(tǒng)和集散控制系統(tǒng)的重要組成部分。

  Microsoft公司的VC++6.0是一種高級編程語言,其基礎類庫 (MFC)封裝了Win32API中的標準通信函數,可方便地支持串口通信。下面就結合實例介紹在Windows環(huán)境下,用VC++6.0編寫串行通信程序的技術及方法。

  2、串行通信工作方式

  Windows系統(tǒng)為每個通信設備開辟了用戶定義的輸入/輸出緩沖區(qū),數據進出通信口均由系統(tǒng)后臺來完成,應用程序只需完成對輸入/輸出緩沖區(qū)操作就可以了。實際過程是每接收一個字符就產生一個低級硬件中斷,Windows系統(tǒng)中的串行驅動程序就取得了控制權,并將接收到的字符放入緩沖區(qū),然后將控制權返還給正在運行的應用程序。如果輸入緩沖區(qū)數據已滿,串行驅動程序用當前定義的流控制機制通知發(fā)送方停止發(fā)送數據,而隊列中的數據按先進先出 (FIFO)的次序處理。

  在Windows中,串行通信有兩種工作方式:查詢方式和事件驅動方式。查詢方式占用大量的CPU時間,效率較低,但是數據不易丟失;而Win32操作系統(tǒng)基于事件驅動 (也稱為消息驅動)機制的內核,支持基于進程的協(xié)同式多任務和基于多線程的搶先式多任務?;谑录寗拥亩嗑€程應用程序實際上在其內部實現了多任務擴展,為代碼賦予了并行執(zhí)行的特性,可以使應用程序對CPU的利用率大大提高,從而提高系統(tǒng)的響應能力,加快信息處理速度,提高通信程序的實時性和增大數據吞吐量。

  基于以上分析,以事件驅動方式實現Windows下的串行通信更具優(yōu)勢,它能完成較大數據量的實時通信,大大提高了通信的效率,故本程序采用此種方式進行串行通信,至于通信的可靠性可以通過軟件設計來保證。
3、系統(tǒng)組成及功能

  本系統(tǒng)采用分布式上下位機結構,上位機以Windows和PC機作為軟硬件資源,下位機由MOTOROLA單片機MC68HC908GP32控制。上下位機之間采用RS232通訊,實現數據交換。利用串行通信的方式,將現場采集的數據交由計算機進行處理,實現對現場設備的監(jiān)測和控制。各組成部分功能如下:

  3.1上位機

  以工業(yè)PC機、Windows操作系統(tǒng)及支持串行通訊程序的監(jiān)控軟件作為軟硬件環(huán)境;

  3.2下位機

  采用MOTOROLA公司生產的高性能CMOS單片機MC68HC908GP32。MC68HC908GP32IDK在線編程開發(fā)系統(tǒng)是基于MC68HC908GP32的開發(fā)應用系統(tǒng),它由核心子板和目標評估母板兩部分組成。將目標評估母板作為本系統(tǒng)下位機的硬件接口板,利用目標評估母板上的可編程串行通信接口SCI即可實現MOTOROLA單片機與PC機的串行通信。

  在使用串行通信接口SCI之前,應對其進行初始化,主要包括波特率寄存器(BAUD)、串行通信數據寄存器(SCDR)、串行通信控制寄存器(SCCR)、串行通信狀態(tài)寄存器(SCSR)初始化。其中,串行通信狀態(tài)寄存器SCSR為產生SCI系統(tǒng)中斷邏輯電路提供輸入信號。對單片機的編程采用匯編語言,其接收和發(fā)送子程序如下:

GETD: BRCLR 5,SCSR,GETD;//接收子程序
LDA SCDR
RTS
SEND: BRCLR 7,SCSR,SEND;//發(fā)送子程序
STA SCDR
RTS

  4、上位機串行通信程序

  在Windows環(huán)境下,利用Visual C++6.0實現串行通信主要有兩種編程方法:

  (1) 使用Windows Visual C++6.0 ActiveX控件;

 ?。?) 調用Windows的API函數。

  第一種方法雖然簡單易用,但由于必須拿到對話框中使用,在一些需要在線程中實現通信的應用場合,控件的使用顯得捉襟見肘。而且這種方法經常發(fā)生數據丟失的情況,不能滿足實時系統(tǒng)的需求。第二種方法要復雜一些:API是附帶在Windows內部的一個極其重要的組成部分。Windows的32位API主要是一系列很復雜的函數、消息的集合,它可以看作是Windows系統(tǒng)為在其下運行的各種開發(fā)系統(tǒng)提供的開放式通用功能增強接口。調用API函數,既能保證數據的完整,又可以讓我們清楚地掌握串口通信的機制,熟悉各種配置和自由靈活采用不同的流控進行串口通信。所以,在本系統(tǒng)中通過調用API函數來實現串行通信。

  4.1程序設計思路

  串口通信應用程序設計的總體思路是:首先,確定要打開的串口名、波特率、奇偶校驗方式、數據位、停止位,傳遞給CreateFile()函數打開特定串口;其次,為了保護系統(tǒng)對串口的初始設置,調用GetCommTimeouts()得到串口的原始設置;然后,初始化DCB對象,調用SetCommState()設置DCB,調用SetCommTimeouts()設置串口超時控制;再次,設置串口接發(fā)送數據的緩沖區(qū)大小,串口的設置就基本完成,之后就可以用ReadCommBlock/WriteCommBlock來讀/寫串口了。

  一般來說,串口的讀寫由串口讀寫線程完成,這樣可以避免讀寫阻塞時主程序死鎖。本程序是對于全雙工的串口讀寫,所以分別開啟讀線程和寫線程。

  4.2編程技術細節(jié)

圖1為本程序的編程步驟。



  4.2.1打開串行口

  在Windows下,串行口作為文件處理,使用文件操作對串行口進行處理。調用CreateFlie打開串口,如果成功,返回一個操作句柄,該句柄供隨后對串行口的設置、讀寫等操作用。

if ((COMDEV( npTTYInfo ) = CreateFile( szPort,
GENERIC_READ | GENERIC_WRITE, //對串口可進行讀寫操作
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |
FILE_FLAG_OVERLAPPED, // 采用異步方式讀寫串口
NULL )) = = (HANDLE) -1 )
return ( FALSE ) ; //若打開串口失敗,異常錯誤
else //打開串口成功,繼續(xù)下面的操作
 
4.2.2初始化串行口

  1)DCB設置

  串行口打開成功后,接著要對串行口初始化,設置串行口的通信參數。修改這些參數將要用到設備控制塊DCB(Device Control Block)。DCB結構定義了串口設備的控制設置,它是個復雜的數據結構,有近30個數據成員。許多通信的重要設置諸如波特率、奇偶校驗類型、數據位、停止位等都是在DCB結構中設置的,并能通過DCB隨時進行修改。

DCB dcb; //定義數據控制塊結構
GetCommState (COMDEV( npTTYInfo ),&dcb); //讀串口原來的參數據設置
dcb.BaudRate=9600;
dcb.ByreSize=8;
dcb.Parity=NOPARITY ;
dcb.StopBits=ONESTOPBIT ;
SetCommState(COMDEV( npTTYInfo ) ,&dcb); //串口參數設置

  2)流控設置

 ?、儆布骺?br>
  串口通信的硬件流控有兩種:DTE/DSR方式和RTS/CTS方式,這與DCB結構的初始化有關系。本程序對這兩種方式都進行了處理,使用者可以根據自己的需要任意選擇。

bSet = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_DTRDSR) != 0) ;
dcb.fOutxDsrFlow = bSet ;
if (bSet)
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE ;
else
dcb.fDtrControl = DTR_CONTROL_ENABLE ;
bSet = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_RTSCTS) != 0) ;
dcb.fOutxCtsFlow = bSet ;
if (bSet)
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE ;
else
dcb.fRtsControl = RTS_CONTROL_ENABLE ;

  ②軟件流控

  串口通信中采用特殊字符XON和XOFF控制串口數據的收發(fā)。它也是通過對DCB的初始化來完成的,與此相關的DCB成員是:fOutX、fInX、XoffChar、XonChar、XoffLim和XonLim。

bSet = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_XONXOFF) != 0) ;
dcb.fInX = dcb.fOutX = bSet ;
dcb.XonChar = ASCII_XON ;
dcb.XoffChar = ASCII_XOFF ;
dcb.XonLim = 100 ;
dcb.XoffLim = 100 ;
fRetVal = SetCommState( COMDEV( npTTYInfo ), &dcb ) ;
return ( fRetVal ) ;

  4.2.3超時設置

  在通信中,超時是個很重要的因素。譬如由于某種原因數據接收過程突然被中斷或者數據發(fā)送過程突然被停止,這時如果不采取相應的措施,可能會引起輸入輸出線程掛起或被無限阻塞。Windows對于這類問題提供了超時控制機制,通過超時設置來決定通信是否異常并做出相應處理。

  串口通信中的超時設置分為兩步:首先設置COMMTIMEOUTS結構的五個變量,然后調用SetCommTimeouts()設置超時值。對于使用異步方式讀寫的操作,如果操作被掛起后,異步成功完成了讀寫,GetOverlappedResult()函數將返回TRUE。另外還可以用GetCommTimeouts()得到系統(tǒng)的初始值。

  4.2.4串行口讀寫操作

  串口的讀寫操作有兩種方式:同步方式(Nonoverlapped)和異步方式(Overlapped)。同步方式是指必須完成了讀寫操作,函數才返回,這可能造成程序的死掉。因為如果在讀寫時發(fā)生了錯誤,永遠不返回就會出錯,可能線程就永遠等待在那兒。而異步方式則靈活得多了。當調用CreateFile()函數打開端口時,就會使用FILE-FLAG-OVERLAPPED標志通知o/s(讀寫完成標志):將在重疊的格式下使用文件。這種情況意味著對ReadFile()函數和WriteFile()函數調用后立即返回,無需等待它們的操作完成。這時ReadFile()函數和WriteFile()函數使用OVERLAPPED管理重疊輸入/輸出,把這個結構傳遞給函數,直到異步輸入/輸出完成才會釋放它,之后再把同一結構傳遞給GetOverlappedReult()函數,以獲得最后的輸入/輸出操作的數據。一旦讀寫不成功,就將讀寫掛起,函數直接返回,可以通過GetLastError()函數得知讀寫未成功的原因。所以,本程序采用異步方式操作:

fReadStat = ReadFile( COMDEV( npTTYInfo ), lpszBlock,
dwLength, &dwLength, &READ_OS( npTTYInfo ) ) ;
if (!fReadStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult( COMDEV( npTTYInfo ),
&READ_OS( npTTYInfo ), &dwLength, TRUE ))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
continue; //讀寫未完成,繼續(xù)
else
{
ClearCommError( COMDEV( npTTYInfo ),
&dwErrorFlags, &ComStat ) ; //發(fā)生錯誤,清除錯誤標志
break;
}
}}}

  4.2.5關閉串口

  串行口是非共享資源,應用程序打開串口后,即獨占資源,其它應用程序無法再訪問,直到該應用程序釋放串口。所以打開串口后,一定要關閉串口。關閉串口只要使用API調用CloseHandle()關閉串口的句柄就可以了。但是值得注意的是在關閉串口之前必須保證讀寫線程已經退出,在線程退出之前,通知主線程可以關閉串口。
 4.3串行通信性能的提高

  1)錯誤處理

  在串口通信中,可能會發(fā)生很多的錯誤,造成少讀字節(jié)數,使用ClearCommError()函數可以檢測錯誤并且清除錯誤條件。

  2)控制命令

  本程序可以使用自己的流控:利用 EscapeCommFunction()函數來模擬特殊字符XON和XOFF,將硬件信號設置為"ON"和"OFF"。

EscapeCommFunction( COMDEV( npTTYInfo ), SETDTR ) ; // 發(fā)送DTR信號
……
EscapeCommFunction( COMDEV( npTTYInfo ), CLRDTR ) ; //清除DTR信號3)引入Sleep函數

  由于Windows操作系統(tǒng)的消息處理機制,使用Timer控件和定時函數來確定的間隔時間,不能適合實際應用。這是因為Windows的多任務處理方式。如果計算機在執(zhí)行串行通信程序的同時還執(zhí)行其它程序,那么就要等待較長時間才能響應串行通信程序,定時不準確。因此,采用Sleep函數,可以在定時的時間范圍內停止進程的所有動作,定時的精確性有了保障。

  另外,引入多線程,為串行通信程序賦予較高的優(yōu)先級,避免在接收過程中被打斷,也能提高串行通信的性能。

  5、結論

  Windows環(huán)境下的應用程序編程是目前的主要趨勢。它提供了豐富的資源,VC++還提供了面向對象程序設計的功能。Windows的API技術可以清楚地掌握串口通信的機制,且探制手段靈活,功能強大。用API技術開發(fā)的串行通信程序在實際應用中,很大地提高了通訊性能和通信的可靠性。本設計利用 VC++的強大功能, 在 Windows環(huán)境下開發(fā)了PC機與單片機的串行通信軟件,對于國內的中、小型企業(yè)具有現實意義。本軟件經過在一個實際的工業(yè)集散系統(tǒng)中的應用表明,運行狀態(tài)良好,靈活方便。
 
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
API串口通信
一種調用Win95 API實現串行通信的查詢方法
用Windows API 實現串行通信
串口編程實現單片機和PC的通訊
CMScomm中的函數則么用?CMScomm的介紹太少
用VC 6.0實現串行通信的三種方法
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服