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

首頁 新聞 工控搜 論壇 廠商論壇 產品 方案 廠商 人才 文摘 下載 展覽
中華工控網首頁
  P L C | 變頻器與傳動 | 傳感器 | 現場檢測儀表 | 工控軟件 | 人機界面 | 運動控制
  D C S | 工業(yè)以太網 | 現場總線 | 顯示調節(jié)儀表 | 數據采集 | 數傳測控 | 工業(yè)安全
  電 源 | 嵌入式系統(tǒng) | PC based | 機柜箱體殼體 | 低壓電器 | 機器視覺
Windows下串行通信編程技術及其實現
中華工控網
收藏本文     查看收藏
Windows 95下串行通信編程技術及其實現</P><P> 郭峰林 朱才連</P><P>   摘 要 本文首先簡單討論MSDOS、16位Windows和Windows95下的通信編程差別,然后著重講述32位Windows95 環(huán)境下的通信編程技術,最后給出利用該技術實現串行通信的實例。<BR>   關鍵詞 API函數,串行通信,中斷,查詢,線程,同步,異步,阻塞</P><P> TECHNIQUE OF SERIAL COMMUNICATION PROGRAMMING<BR> AND ITS REALIZATION IN WINDOWS95</P><P> Guo Fenglin Zhu Cailian<BR> Institute of Geodesy & Geophysics, Chinese Academy of Sciences, Hubei.Wuhan 430077</P><P>   Abstract This paper discusses the difference of communication programming in the operating system of MSDOS,16 bit Windows and Windows95.Then tells of some problems about serial communication programming technique in 32 bit OS of windows95. Finally, an example of the application of this technique in windows95is provided.<BR>   Keywords API function, Serial communication, Interrupt, Poll, Thread, Synchronization, Asynchronization</P><P> 1 前言<BR>   Windows95以其形象的圖形界面設計、操作簡單、功能強大、可靠性高等優(yōu)點,贏得了越來越多的用戶,開發(fā)Windows95應用程序已經成為當今的主流。在諸多的應用開發(fā)中,與外部硬件設備通信是常見的應用,而串行通信以其簡單的硬件連接方式常常成為應用開發(fā)者的首選。然而串行通信編程從MSDOS、Windows3.1到Windows95各不相同,雖然在功能上越來越強,但是編程的復雜度也相應增大。<BR>   筆者最近在Windows95環(huán)境下開發(fā)一套“公安110智能報警系統(tǒng)”,該系統(tǒng)需要對報警電話進行實時監(jiān)控,以便能實時地進行接警和處警。報警電話的監(jiān)控是通過檢測從電話交換機中饋送的RS232標準的串行通信信號,其中串行口通信采用3線方式。該系統(tǒng)采用Windows95下的Visual C++ 5.0編寫,由于有關Windows95的串行口通信編程方面的資料少,串行通信編程的實例也不多見,筆者在成功開發(fā)“公安110智能報警系統(tǒng)”的基礎上,取得了一些經驗,現在將有關串行口通信方面的一些關鍵技術寫出來,供廣大的編程者借鑒、參考。</P><P> 2 下串行通信編程特征<BR>   MSDOS下的串行通信編程較簡單,通信編程可以直接對串口的物理地址進行編程操作同時配合BIOS調用,即可實現串行口數據讀寫。<BR>   在Windows下,串行口作為系統(tǒng)資源,由設備驅動程序統(tǒng)一管理,用戶不能象在MSDOS下一樣直接對串行口硬件端口進行編程。16位的Windows3.1操作系統(tǒng)提供了專門的串行通信的API函數:OpenComm()、CloseComm()、ReadComm()、 WriteComm()等,通過這些專用API(Application Programming Interfaces)函數來設置和讀、寫串行口。而Windows95將串行口和其它通信設備如Modern、傳真機等統(tǒng)一視作文件,對串行口的打開、關閉、讀寫等操作與操作普通文件的API函數相同,如CreateFile()、CloseHandel()、ReadFile()、WriteFile(),正是由于這些函數的“多態(tài)性”, 同時還由于需要結合Windows95的線程編程、事件驅動等新技術,因而使得Windows95下的串行口通信編程比較復雜。</P><P> 3 Windows95下串行通信API函數<BR>   在Windows95中將串行口與文件的統(tǒng)一了起來,對它們的打開、讀、寫、關閉等操作都使用相同的API函數,但是它們之間又有差別,譬如串行口不能象文件一樣可以被刪除,這些差別體現在API函數中部分參數的設置上。<BR>   弄清串行通信API函數的用法是掌握串行通信編程技術的關鍵。下面介紹幾個與串行通信編程密切相關的API函數,著重說明這些API函數在進行串行通信時參數設置需要注意的地方。其它沒有提及的函數及參數可以參考Windows95 API函數手冊。<BR> 3.1 打開串行口API函數<BR>   Windows95通信會話以調用CreateFile()函數打開串行口開始。調用CreateFile()打開串口成功,返回一個操作句柄。該句柄供隨后對串行口的設置、讀寫等操作用。<BR>   CreateFile()函數原型:<BR>  HANDLE CreateFile(LPCTSTR szDevice, DWORD dwAccess,<BR> DWORD dwShareMode, LPSECURITY—ATTRIBUTES lpSA,<BR> DWORD dwCreate, DWORD dwFlagsAndAttributes,<BR> HANDLE hTemplateFile );<BR>   調用此函數要注意這幾個參數的設置:dwShareMode指定該端口的共享屬性。該參數是為文件共享提供的,串行口不能作為共享設備。故參數值必須為0,這是文件與通信設備之間的主要差異之一;dwCreate必須為OPEN—EXISTING。因為CreateFile()只能打開存在的端口,而不能象創(chuàng)建新文件一樣創(chuàng)建物理上不存在的新串口;dwFlagsAndAttributes描述了該端口的各種屬性。對于文件來說,具有多種屬性(只讀、隱藏、系統(tǒng))是可能的,但是對于串行口,唯一有意義的設置是FILE—FLAG—OVERLAPPED;參數hTemplateFile必須為NULL。<BR>   返回值:若成功,返回創(chuàng)建的句柄;否則返回,INVALID—HANDLE—value.<BR>   舉例:打開串行口1<BR>  HANDLE hComm;                           //定義句柄變量<BR>  hComm = CreateFile( "COM1", <BR>  GENERIC—READ|GENERIC—WRITE,NULL,NULL,<BR>  OPEN—EXISTING,FILE—FLAG—OVERLAPPED,NULL);<BR>  if (hComm == INVALID—HANDLE—value) {……. <BR>  // 打開串口錯誤的處理}</P><P> 3.2 配置串行口API函數<BR>   串行口打開成功,接下來可以配置串行口通信參數如波特率、數據位數、停止位、校驗位等。修改這些參數時要和設備控制塊DCB(Device Control Block)打交道,DCB有近30個數據成員,是一個很復雜的數據結構,全部弄清楚它們的含義相當費時。而對于采用3線方式的串行通信來說,DCB結構中絕大多數參數可以不予考慮,因為只要設置好波特率、數據位、停止位、校驗位等幾個關鍵參數就行。這里介紹一種簡捷的方法可以做到不了解DCB的詳細內容也可以設置好串行通信參數。<BR>   通過下面的程序來說明串行通信參數的設置方法。例程中利用BuildCommDCB函數來設置DCB,然后用函數SetCommState()配置串行通信口。<BR> DCB dcb ;                              //定義設備控制塊<BR> GetCommState(hComm,&dcb);                 //取出系統(tǒng)缺省設備控制塊<BR> BuildCommDCB("COM2:9600,N,8,1",&dcb);                //設置DCB主要參數<BR> SetCommState(hComm,&dcb);<BR> 3.3 超時設置API函數<BR>   編寫通信應用程序的一個很關鍵的問題就是如何處理通信中的不可預測的事件。譬如接收數據過程中突然被中斷,或者發(fā)送數據突然停止等等。如果不認真對待,這些情況可能會引起I/O線程掛起或者線程被無限阻塞。Windows95對于這類問題提供了安全措施,它讓你通過超時設置來決定通信是否異常并作相應處理。因此超時設置在串行通信中顯得尤為重要。<BR>   超時設置過程分為兩步,首先設置COMMTIMEOUTS結構中的五個變量,然后調用SetCommTimeouts()函數設置超時值。COMMTIMEOUTS結構的定義如下:<BR>  typedef struct — COMMTIMEOUTS {<BR> DWORD ReadIntervalTimeout;                      //讀端口間隔超時<BR> DWORD ReadTotalTimeoutMultiplier;                //讀端口總超時乘數<BR> DWORD ReadTotalTimeoutConstant;                //讀端口總超時常數(ms)<BR> DWORD WriteTotalTimeoutMultiplier;                //寫端口總超時乘數<BR> DWORD WriteTotalTimeoutConstant;               //寫端口總超時常數(ms)<BR> } COMMTIMEOUTS,*LPCOMMTIMEOUTS;<BR> 3.4 讀串口API函數<BR>   串行口打開后,可以對它進行讀寫操作。讀串行口的函數原型:<BR>  BOOL ReadFile (HANDLE hFile, LPVOID lpBuffer,<BR> DWORD nNumberOfBytesToRead,<BR> LPDWORD lpNumberOfBytesRead, <BR> LPOVERLAPPED lpOverlapped data);<BR>   其中,第一個參數hFile是由CreateFile()返回的句柄。參數lpBuffer是讀取的數據緩沖區(qū)指針,要注意給該數據緩沖區(qū)分配足夠的空間;參數nNumberOfBytesToRead是要讀取的字節(jié)數;參數lpNumberOfBytesRead是實際讀取的字節(jié)數;最后一個參數lpOverlapped 是指向一個可重疊I/O(異步)的數據結構指針。如果lpOverlapped設置為NULL,則ReadFile()工作在同步方式;如果lpOverlapped指向一個重疊結構,則工作在異步方式。<BR> 3.5 寫串口API函數<BR>  BOOL WriteFile (HANDLE hFile,             // 由CreateFile()返回的句柄<BR>               LPCVOID lpBuffer,            // 寫緩沖區(qū)指針<BR>            DWORD nNumberOfBytesToWrite,         // 要寫的字節(jié)數<BR>            LPDWORD lpNumberOfBytesWritten,       // 實際寫的字節(jié)數<BR>            LPOVERLAPPED lpOverlapped  // 指向一個可重疊I/O的數據結構);<BR>             WriteFile()函數的工作方式選擇與ReadFile()的相同,在此不重復。<BR> 3.6 關閉串口API函數<BR>   串行口是非共享資源,某應用程序打開串行口后,即獨占該資源,使其它應用程序無法再訪問,直到該應用程序釋放串口。所以打開串口后,一定要關閉串口。關閉串口函數較簡單。函數原型:BOOL CloseHandle( HANDLE hObject );其中hObject參數為CreateFile()返回的端口句柄。返回值非0,則調用成功。</P><P> 4 Windows95的串行通信工作方式<BR>   串行通信會話以調用CreateFile()函數打開串行口開始,接著設置串行口波特率、數據位、校驗位、停止位等參數以及超時參數,最后選擇一種工作方式讀、寫串行口。在Windows95中,串行通信有兩種工作方式可供選擇:查詢方式和事件驅動方式。這兩種工作方式各有優(yōu)缺點,用戶可以根據應用程序的實際需要選擇其中的一種工作方式,下面對這兩種工作方式分別介紹。<BR> 4.1 查詢方式<BR>   對于從串口讀取數據來說,查詢是最為直接、易于理解的技術。但是查詢會占用大量的CPU時間,效率較低。利用查詢方式讀取串口數據時通常要建立一個線程,建立線程使用CreateThread()函數。循環(huán)查詢在線程里進行。舉例:(假設端口已經打開)<BR>  DWORD ReadThread(LPDWORD lpdwParam)<BR> { BYTE Buff[100];                          //讀數據緩沖區(qū)<BR> DWORD nBytesRead;                         //實際讀取的字節(jié)數<BR> COMMTIMEOUTS Timeouts;                          //超時設置<BR> Memset(&Timeouts,0,sizeof(COMMTIMEOUTS));<BR> Timeouts.ReadIntervalTimeout = MAXDWORD;<BR> SetCommTimeouts(hComm,&Timeouts);<BR> While(bReading){<BR> if(!ReadFile(hComm,Buff,100,&nBytesRead,NULL))<BR> {………                             //讀取數據出錯處理}<BR> else{………                          //正確讀取數據的處理}<BR> }<BR> PurgeComm(hComm,PURGE—RXCLEAR);<BR> return 0;<BR> }<BR>   例程中,線程的退出由bReading標志控制,當bReading為TRUE時,循環(huán)串口;當breading為FALSE時,線程退出。<BR> 4.2 事件驅動方式<BR>   事件驅動I/O方式是指線程通過監(jiān)視通信資源中的一組事件來進行I/O操作,這種方式類似于MSDOS下的中斷工作方式,效率高?杀槐O(jiān)視的事件列表如下:<BR> </P><P> 事件掩碼 含義 <BR> EV—BREAK 檢測到輸入終止 <BR> EV—CTS CTS(清除發(fā)送)信號改變狀態(tài) <BR> EV—DSR DSR(數據設置就緒)信號改變狀態(tài) <BR> EV—ERR 發(fā)生了線路狀態(tài)錯誤 <BR> EV—RING 檢測到振鈴 <BR> EV—RLSD RLSD信號改變狀態(tài) <BR> EV—RXCHAR 收到任何字符并放進輸入緩沖區(qū) <BR> EV—RXFLAG 收到事件字符,并放進輸入緩沖區(qū) <BR> EV—TXEMPTY 輸出緩沖區(qū)中最后一個字符發(fā)送出去 </P><P>   實際編程中,對串行口的讀、寫操作需要建立兩個工作者線程。在讀或寫線程中可以通過SetCommMask()函數設置事件屏蔽來監(jiān)視指定通信資源上的事件。指定一組事件后,線程可以使用WaitCommEvent()函數等待其中一個事件發(fā)生,在等待過程中它將花費極少的CPU時間。注意:WaitCommEvent()函數和讀寫操作函數一樣可以同步使用,也可以異步使用,這主要取決于在第三個參數中是否指定OVERLAPPED結構。如果指定為NULL,該函數就是同步的,必須等到SetCommMask()中指定的事件有一個發(fā)生時它才返回;如果指定了一個OVERLAPPED結構,該函數即工作在異步方式。通常將該函數工作在同步方式。<BR>   下面的例程演示了利用事件驅動I/O方式從串行口讀取數據。<BR> DWORD ReadThread(LPDWORD lpdwParam)<BR> { BYTE Buff[100];                          //讀數據緩沖區(qū)<BR> DWORD nBytesRead, dwEvent, dwError;<BR> COMMTIMEOUTS Timeouts;                          //超時設置<BR> Memset(&Timeouts,0,sizeof(COMMTIMEOUTS));<BR> Timeouts.ReadTotalTimeoutMultiplier=5;<BR> Timeouts.ReadTotalTimeoutConstant=100;<BR> SetCommTimeouts(hComm,&Timeouts);<BR> SetCommMask(hComm,EV—RXCHAR);    //設置EV—RXCHAR掩碼,當任何字符到達時產生事件<BR> While(bReading){<BR> if(WaitCommEvent(hComm,&dwEvent,NULL))<BR> {                              //接收緩沖區(qū)有字符到達<BR> if(dwEvent & EV—RXCHAR)<BR> {                               //確認是EV—RXCHAR事件<BR> if(!ReadFile(hComm,Buff,1,&nBytesRead,NULL))<BR> {……                                 //處理讀錯誤}<BR> else{……                            //正確接收字符處理}<BR> }else{……                         //非EV—RXCHAR事件的處理} <BR> }}<BR> PurgeComm(hComm,PURGE—RXCLEAR);<BR> return 0;}<BR>   在上面的例程中,設置EV—RXCHAR事件掩碼,則告訴Windows無論何時接收到一個字節(jié),就產生一個事件。在WaitCommEvent()返回后,比較該函數返回的事件掩碼,如果是EV—RXCHAR,則說明接收緩沖區(qū)中至少有一個字符處于等待狀態(tài);否則,就是錯誤事件,需要進行錯誤處理。 <BR> 5 效果<BR>   作者在開發(fā)的“公安110智能報警系統(tǒng)”時利用事件驅動方式的串行通信編程技術處理多種系統(tǒng)設備間頻繁的數據交換任務,應用非常成功。系統(tǒng)可實時地監(jiān)控從市話網上不斷傳來的報警電話。</P><P> 作者簡介:郭峰林 碩士研究生。<BR> 朱才連 博士生導師,研究員。</P><P> 作者單位:中國科學院測量與地球物理研究所 湖北.武昌(430077)</P><P> 參考文獻<BR> [1] Microsoft Corporation,著.Win32程序員參考大全(二). 欣 力,等譯.北京:清華大學出版社,1995,4<BR> [2] Microsoft Corporation. Microsoft Developer Network<BR> [3] Peter W.Gofton,著.精通串行通信.王仲文,等譯.北京:電子工業(yè)出版社,1995,2<BR> [4] Charles A.Mirho, Andre Terrisse,著. Windows95通信編程.賀 軍,等譯.北京:清華大學出版社,1997,12<BR> [5] Scott Stanfield, RalphArvesen,著. Visual C++4開發(fā)人員指南.北京:機械工業(yè)出版社1997,6</P><P> <BR>
 

狀 態(tài): 離線

公司簡介
產品目錄

公司名稱: 中華工控網
聯 系 人: 客服中心
電  話: 0755-26546361
傳  真: 0755-26585268
地  址: 深圳市南山區(qū)創(chuàng)業(yè)路現代城華庭1棟6A
郵  編: 518054
主  頁:
 
該廠商相關技術文摘:
智能儀器儀表的發(fā)展特點與前景分析
電動機性能虛擬儀器測試系統(tǒng)設計與實現
視頻監(jiān)控護航高鐵安全運營
基于PLC,觸摸屏及變頻器對吹膜機的改造
永宏PLC應用于自助圖書借還終端機
基于永宏PLC的GSM通訊原理及其應用
改善汽車生態(tài)學、安全性和舒適性,四大測試分析是關鍵
改善汽車生態(tài)學、安全性和舒適性,四大測試分析是關鍵
數控技術的發(fā)展趨勢及產業(yè)化
數控技術發(fā)展戰(zhàn)略與發(fā)展途徑的思考
用Energid 的軟件進行機器人的抓取和操作
如何借助RFID技術升級企業(yè)信息管理水平
更多文摘...
立即發(fā)送詢問信息在線聯系該技術文摘廠商:
用戶名: 密碼: 免費注冊為中華工控網會員
請留下您的有效聯系方式,以方便我們及時與您聯絡

關于我們 | 聯系我們 | 廣告服務 | 本站動態(tài) | 友情鏈接 | 法律聲明 | 不良信息舉報
工控網客服熱線:0755-86369299
版權所有 中華工控網 Copyright©2022 Gkong.com, All Rights Reserved