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

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

狀 態(tài): 離線

公司簡(jiǎn)介
產(chǎn)品目錄

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

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