




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、收稿日期:2001-11-11實(shí)現(xiàn)基于Visual C +710的多線程串口通信李東曉,李曉明,肖鯤,張發(fā)忠,彭家銀(武漢大學(xué)電力工程系,湖北武漢430072摘要:串口通信程序多是用微軟提供的MSC omm 控件實(shí)現(xiàn)的,但MSC omm 控件實(shí)現(xiàn)方法很難加入多線程技術(shù)提高程序的執(zhí)行效率,尤其對微機(jī)與多臺智能設(shè)備之間同時(shí)進(jìn)行通信,這種方法的單線程局限性就更明顯。為此,深入介紹了32位串口通信的結(jié)構(gòu)體和Windows API 函數(shù)及多線程編程技術(shù),并結(jié)合面向?qū)ο蟮木幊趟枷?將Windows API 函數(shù)、結(jié)構(gòu)體及多線程技術(shù)進(jìn)行了封裝,形成新的串口通信類CC ommunication ,該類可以完成
2、MSC omm 控件的所有功能,用該類開發(fā)的程序比用MSC omm 控件開發(fā)的程序的執(zhí)行速度快。應(yīng)用該類可很方便地實(shí)現(xiàn)基于Visual C +7.0多線程串口通信,且具有通用性好、使用性強(qiáng)等優(yōu)點(diǎn)。關(guān)鍵詞:Visual C +7.0;Windows API ;結(jié)構(gòu)體;多線程;串口通信中圖分類號:T N 91519文獻(xiàn)標(biāo)識碼:A 文章編號:1006-6047(200209-0013-04本文深入介紹了如何實(shí)現(xiàn)基于Visual C +7.0的Win 32的多線程串口通信,用此方法實(shí)現(xiàn)了上位機(jī)與P LC (Omron C200H 之間的串口通信,應(yīng)用到火電廠翻車機(jī)輸煤實(shí)時(shí)監(jiān)控系統(tǒng)中,具有穩(wěn)定、可靠、實(shí)
3、用性強(qiáng)的特點(diǎn)。1實(shí)現(xiàn)方案Visual C +7.0作為面向?qū)ο缶幊陶Z言的代表,與其他面向?qū)ο缶幊陶Z言相比,Visual C +7.0不僅具有程序執(zhí)行速度快(相當(dāng)于匯編語言的優(yōu)點(diǎn),而且還可以與Windows API 函數(shù)實(shí)現(xiàn)無縫連接。因此,選用Visual C +7.0作為串口通信開發(fā)平臺。用Visual C +7.0開發(fā)串口通信通常有4種方案。a.調(diào)用函數(shù)inp (和outp (直接讀寫串口。b.使用Visual C +7.0提供的串行通信控件MSC omm 。c.用單線程的方法實(shí)現(xiàn)自定義串口通信類,用這些類封裝Windows API 提供的串口通信函數(shù)。d.用多線程的方法實(shí)現(xiàn)自定義串行通信類
4、,在單線程方法的基礎(chǔ)之上加入多線程。本文深入研究多線程方法,基于Visual C +7.0的多線程串口通信,如何編寫class CC ommunication 。111結(jié)構(gòu)體1開發(fā)串口通信程序用到的結(jié)構(gòu)體主要有DC B ,C OM MST ART 和OVER LAPPE D 三種。a.結(jié)構(gòu)體DC B 用于經(jīng)由SetC ommState (函數(shù)設(shè)置端口的參數(shù)。結(jié)構(gòu)DC B 有一個很大的成員列表,這些成員包括端口的波特率、數(shù)據(jù)位、停止位、校驗(yàn)碼、握手信息、控制信息等,詳見文獻(xiàn)1。b.結(jié)構(gòu)體C OM MST ART 由G etC ommError (函數(shù)填充,包括BY TE status ,UI N
5、T cbInQue 和UI NT cbOutQue 三個成員函數(shù)。Status 包含一組標(biāo)志,用于設(shè)置流控制信息(如設(shè)置CSTF CTSH O LD 標(biāo)志,即表明在發(fā)送一個字符之前,發(fā)送器正在等待CTS 線變高;cbInQue 用于指明接收緩沖區(qū)中當(dāng)前共有多少個字符;cbOutQue 指明在當(dāng)前傳送緩沖區(qū)中共有多少個字符。c.ReadFile (和WriteFile (將使用結(jié)構(gòu)體OVER LAPPE D 管理重疊的I/O 。把這個結(jié)構(gòu)體傳遞給函數(shù),直到異步I/O 完成才釋放它。再把同一結(jié)構(gòu)體傳遞給G etOverlappedResult (,以獲得I/O 操作的最后數(shù)據(jù)。112函數(shù)Micro
6、s oft 標(biāo)識通信的API 函數(shù)有20多個。可分為打開串口、初始化串口、讀寫串口和關(guān)閉串口4個部分。a.打開串口,相關(guān)函數(shù)為CreateFile 函數(shù)。該函數(shù)用于創(chuàng)建或打開文件、通道、通信資源,并返回一個句柄,它是W in 32環(huán)境下打開端口的唯一方法。H AND LE CreateFile (LPCTSTR lpFileName ,DW O RD dwDesiredAccess ,DW ORD dwShareM ode ,LPSEC UR ITY ATTRI BUTES lpSecuity ,DW ORD dwCreationDisp osition ,DW ORD dwFlagsAndA
7、ttributes ,H AND LE hT em p lateFile lpFileName 為要打開的端口名,格式為C OMxx ;dwDesiredAccess 為端口的打開方式,有GE NERIC RE AD 和GE NERIC WRITE 。當(dāng)打開通信端口時(shí),只有同時(shí)使用兩者才有意義;dwShareM ode 為文件的共享方式,一般將此參數(shù)設(shè)為0;lpSecurity 為安全級別,一般將此參數(shù)設(shè)為0;dwCreationDisposition 為文件存在方式,使用通信設(shè)備時(shí),串口是存在的,總把此參數(shù)設(shè)為OPE N EXISTI NG;dwF1agsAndAttributes 為串口打
8、開的標(biāo)志,其中,FI LE ATTRI BUTE NOR 2M A L 是必需的,FI LE F LAG OVER LAPPE D 用于指明將要使用文件完成重疊I/O ,若用多線程實(shí)現(xiàn)串口通信,此參數(shù)應(yīng)設(shè)置為FI LE A TTRI BUTE NOR M A L |31第22卷第9期2002年9月電力自動化設(shè)備Electric P ower Automation Equipment FI LE F LAG OVER LAPPE D;hT em plateFile,對于串口通信,此參數(shù)沒有任何意義,設(shè)為0。若函數(shù)成功調(diào)用,則返回打開串口的句柄,否則,返回值I NVA LI D H AND LE
9、VA LUE。b.初始化串口,主要包括函數(shù)G etC ommState, SetC ommState,SetupC omm,G etC ommProperties,G etC om2 mT imeouts,SetC ommT imeouts,這些函數(shù)用于設(shè)置串口通信所需的各類參數(shù)。BOO L G etC ommState(H AND LE hFile,LPDC B lpDC B用于設(shè)置結(jié)構(gòu)體DC B的所有成員。hFile為通信設(shè)備句柄;lpDC B是指向結(jié)構(gòu)體DC B的指針。調(diào)用成功返回TRUE,否則返回FA LSE。BOO L SetC ommState(H AND LE hFile,LPD
10、C B lpD2 C B用結(jié)構(gòu)體DC B設(shè)置串口的所有可配置參數(shù)。hFile為通信設(shè)備句柄;lpDC B是指向結(jié)構(gòu)體DC B的指針。調(diào)用成功返回TRUE,否則返回FA LSE。BOO L SetupC omm(H AND LE hFile,DW ORD dwIn2 Queue,DW ORD dwOutQueue設(shè)置驅(qū)動程序輸入和輸出緩沖區(qū)的大小,hFile 為通信設(shè)備句;dwInQueue為輸入緩沖區(qū)的大小, dwOutQueue為輸出緩沖區(qū)的大小。調(diào)用成功返回TRUE,否則返回FA LSE。BOO L G etC ommT imeouts(H AND LE hFile,LPC OMMTI M
11、 OUTS lpC ommT imeouts讀入端口的當(dāng)前超時(shí)值,設(shè)置結(jié)構(gòu)體C OM MTIME OUTS的所有成員。hFile為通信設(shè)備句柄;LPC OM MTI M OUTS是指向結(jié)構(gòu)體C OM MTI ME OUTS的指針。成功返回TRUE,否則返回FA LSE。BOO L SetC ommT imeouts(H AND LE hFile,LPC OMMTI M OUTS lPC Ommtimeouts用結(jié)構(gòu)體C OM MTI ME OUTS設(shè)置端口的當(dāng)前超時(shí)值。hFile為通信設(shè)備句柄;LPC OM MTI M OUTS是指向結(jié)構(gòu)體C OM MTI ME OUTS的指針。成功返回TRU
12、E,否則返回FA LSE。BOO L PurgeC omm(H AND LE hFile,DW ORD dwFlags用于終止當(dāng)前打開端口正在進(jìn)行的輸入和輸出操作。hFile為通信設(shè)備句柄;dwFlags為命令掩碼中設(shè)置的位,能夠確定由這個函數(shù)調(diào)用完成的確切操作。成功返回TRUE,否則返回FA LSE。c.讀寫串口,包括函數(shù)ReadFile,WriteFile,Set2 C omm Mask和WaitC ommEvent,這些函數(shù)用于對串口進(jìn)行讀寫和監(jiān)控操作。BOO L ReadFile(H AND LE hFile,LPVOI D lpBu ffer, DW ORD nNumberO fBy
13、tesT oRead,LPDW ORD lpNumber2 O fBytesRead,LPOVER LAPPE D,lpOverlapped從串口讀取數(shù)據(jù)的唯一函數(shù)。hFile用于讀操作的端口句柄,由CreateFile函數(shù)創(chuàng)建;lpBu ffer指向接收緩沖區(qū)的指針;nNumberO fBytesT oRead為讀入的字節(jié)數(shù),應(yīng)小于接收緩沖區(qū)的大小;lpNumber2O f2 BytesRead為接收函數(shù)調(diào)用期間讀取的字節(jié)數(shù);lpOverlapped指向一個OVER LAPPE D結(jié)構(gòu),異步讀寫時(shí),更新此結(jié)構(gòu)。成功返回TRUE,否則返回FA LSE。BOO L WriteFile(H AND
14、 LE hFile,LPVOI D lpBu ffer, DW ORD nNumberO fBytesT oRead,LPDW ORD lpNumber2 O fBytesRead,LPOVER LAPPE D,lpOverlapped向串口寫數(shù)據(jù)的唯一函數(shù)。hFile用于讀操作的端口句柄,由CreateFile函數(shù)創(chuàng)建;lpBu ffer指向發(fā)送緩沖區(qū)的指針;nNumberO fBytesT oRead為發(fā)送的字節(jié)數(shù),應(yīng)小于發(fā)送緩沖區(qū)的大小;lpNumberO fBytesRead 為寫函數(shù)調(diào)用期間發(fā)送的字節(jié)數(shù);lpOverlapped指向一個OVER LAPPE D結(jié)構(gòu),異步讀寫時(shí),更新此
15、結(jié)構(gòu),成功返回TRUE,否則返回FA LSE。BOO L SetC omm Mask(H AND LE hFile,DW ORD dw2 EvMask設(shè)置一個打開的通信端口,當(dāng)某些異步事件由WaitC ommEvent調(diào)用發(fā)生時(shí),來報(bào)告這些事件。hFile 為要使用的端口句柄;dwEvMask為端口事件掩碼,可以是下列事件的任意組合:E V BRE AK,E V CTS, E V DSR,E V ERR,E V RI NG,E V RI NG TE,E VR LS D,E V RX80FU LL,E V RXCH AR,E V RXF LAG, E V TXE MPTY。成功返回TRUE,否則
16、返回FA LSE。BOO L WaitC ommEvent(H AND LE hFile,LPDW ORD lpEvtMask LPOVER LAPPE D lpOverlapped等待從串口讀入事件,hFile為要監(jiān)視的端口句柄,lpEvtMask指向接收標(biāo)志發(fā)生事件類型掩碼的32位的變量,lpOverlapped指向一個OVER LAPPE D結(jié)構(gòu)。成功返回TRUE,否則返回FA LSE。d.關(guān)閉串口,函數(shù)CloseHandle,關(guān)閉已打開的串口,停止一切輸入和輸出。BOO L CloseHand(Handle hObjecthObject指向已打開的通信端口句柄。成功返回TRUE,否則返
17、回FA LSE。113多線程Windows98/NT操作系統(tǒng)CPU的時(shí)間按一定的算法分配給多個任務(wù),輪流處理各個任務(wù),這就是并行多任務(wù)。在設(shè)計(jì)計(jì)算機(jī)通信程序時(shí),需要采用并行編程機(jī)制完成各種任務(wù)。并行編程機(jī)制主要有多進(jìn)程和多線程,與多進(jìn)程相比,多線程能更充分地利用計(jì)算機(jī)的CPU,具有更高的效率。用Visual C+ 7.0的MFC(Micros oft F oundation Class實(shí)現(xiàn)多線程,要解決好構(gòu)造線程、線程內(nèi)通信和同步的問題。a.如何構(gòu)造線程。在程序中調(diào)用函數(shù)A fx BeginThread(創(chuàng)建一個新線程。CW inThread3A fx BeginThread(AFX THRE
18、 ADPROC pfnThreadProc,LPVOI D pParam,int nPriority= THRE AD PRI ORITY NORM A L,UI NT nStackSize=0, DW ORD dwCreateFlags=0,LPSEC URITY ATTRI BUTES lpSecurityAttrs=NU LL其中,pfnThreadProc是線程函數(shù)名稱,pParam是傳遞給線程的參數(shù),nPriority為線程的優(yōu)先級,一般來講線程的優(yōu)先級越高,線程獲得CPU的時(shí)間越長。b.如何實(shí)現(xiàn)線程內(nèi)部的通信。有多種方法實(shí)現(xiàn)進(jìn)程中不同線程之間的通信,最好的方法是采用41電力自動化設(shè)
19、備2002年Windows消息映射和事件對象。c.如何實(shí)現(xiàn)線程的同步。實(shí)現(xiàn)線程通信同步有臨界區(qū)、互斥體和信號燈3種方法。本文采取臨界區(qū)技術(shù),線程通過臨界區(qū)技術(shù)安全訪問數(shù)據(jù)。在程序中通過函數(shù)InitializeCriticalSection初始化臨界區(qū),函數(shù)EnterCriticalSection進(jìn)入臨界區(qū),通過函數(shù)LeaveCriticalSection釋放臨界區(qū),實(shí)現(xiàn)對臨界區(qū)的控制。114封裝類2在用Visual C+7.0開發(fā)串口通信軟件時(shí),可直接調(diào)用Windows API通信函數(shù),實(shí)現(xiàn)串口通信,而更為有效的方法是將Windows API通信函數(shù)封裝成類。本文將結(jié)構(gòu)體和Windows AP
20、I通信函數(shù)封裝成類CC ommunication。具體封裝見類CC ommunication 的實(shí)現(xiàn)函數(shù)。11411初始化函數(shù)初始化函數(shù)用于封裝打開串口和初始化串口Windows API函數(shù)。BOO L CC ommunication:Init(CWnd3pP ortOwner, UI NT port,UI NT baud,char parity,UI NT data bit,UI NT stop bit,DW ORD dwC ommEvents,UI NT readbu ffersize, UI NT writebu ffersize,BOO L bBinary,UI NT handShak
21、ing, BOO L bRTS,BOO L bDTRInitializeCriticalSection(&m csC ommunicationSy2 nc;初始化臨界區(qū)EnterCriticalSection(&m csC ommunicationSync;進(jìn)入臨界區(qū)m hC omm=CreateFile(P ort,GE NERIC RE AD| GE NERIC WRITE,0,NU LL,OPE N EXISTI NG,FI LE F LAG OVER LAPPE D,0;創(chuàng)建文件句柄設(shè)置通信參數(shù)m C ommT imeouts.ReadIntervalT imeout=
22、1000;m C ommT imeouts.ReadT otalT imeoutMultiplier= 1000m C ommT imeouts.ReadT otalT imeoutC onstant= 1000;m C ommT imeouts.WriteT otalT imeoutMultiplier= 1000;m C ommT imeouts.WriteT otalT imeoutC onstant= 1000;if(SetC ommT imeouts(m hC omm,&m C omm2T ime2 outsif(SetC omm Mask(m hC omm,dwC ommE
23、ventsif(G etC ommState(m hC omm,&m dcbif(BuildC ommDC B(Baud,&m dcbif(SetC ommState(m hC omm,&m dcbelseProcessErrorMessage(“error”;PurgeC omm(m hC omm,PURGE RXC LE AR| PURGE TXC LE AR|PURGE RX ABORT|PURGE TX ABORT;終止串口操作LeaveCriticalSection(&m csC ommunicationSync;離開臨界區(qū)return TRUE;11
24、412線程處理函數(shù)UI NT CC ommunication:C ommThread(LPVOI D pParam CC ommunication3pP ort=(CC ommunication3pPa2 ram;if(pP ort2>m hC ommPurgeC omm(port2>m hC omm,PURGE RX2 C LE AR|PURGE TXC LE AR|PURGE RX ABORT| PURGE TX ABORT;for(;無限期循環(huán)bResult=WaitC ommEvent(port2>m hC omm, &Event,&port2>
25、m ov;等待通信事件if(!bResultswitch(dwError=G etLastError(等待觸發(fā)線程事件Event=WaitF orMultipleObjects(3,port2>m hEventArray,FA LSE,I NFI NITE;switch(Event case0:;異常case1:;讀串口if(C ommEvent&E V RXCH ARReceiveChar(port,comstat;調(diào)用讀串口函數(shù)break;case2:;寫串口WriteChar(port;調(diào)用寫串口函數(shù)break;11413讀串口函數(shù),完成串口的讀操作v oid CC omm
26、unication:Receivechar(CC ommunication3 port,C OMST AT comstatfor(;無限循環(huán)bResult=ReadFile(port2>m hC omm,&RX Bu ff, 1,&BytesRead,&port2>m ov;:SendMessage(pP ort2>m pOwner2>m51第9期李東曉,等:實(shí)現(xiàn)基于Visual C+710的多線程串口通信hWnd,W M C OM M RXCH AR,(WPARAMRX Bu ff, (LPARAMport2>m nP ortNr;114
27、14調(diào)用線程函數(shù),開始一個新的線程BOO L CC ommunication:StartThread(if(!(m Thread=A fx BeginThread(C ommThread, thisreturn FA LSE;return TRUE;11415掛起線程函數(shù),掛起正在運(yùn)行的線程BOO L CC ommunication:StopThread(m Thread2>SuspendThread(;return TRUE;11416寫串口函數(shù)v oid CC ommunication:WriteChar(CC ommunication3 portResetEvent(port2&g
28、t;m hWriteEvent;觸發(fā)線程的寫事件EnterCriticalSection(&port2>m csC ommunic2ation2 Sync;if(bWrite串口寫操作bResult=WriteFile(port2>m hC omm, port2>WriteBu ffer,strlen(char3port2>WriteBu ffer, &BytesSent,&port2>m ov;if(!bWrite異步處理bResult=G etOverlappedResult(port2>m hC omm,&port2&g
29、t;m ov,&BytesSent,TRUE;LeaveCriti2 calSection(&port2>m csC ommunicationSync;釋放臨界區(qū)2應(yīng)用實(shí)例基于類CC ommunication的串口通信程序,應(yīng)用到火電場翻車機(jī)實(shí)時(shí)監(jiān)控系統(tǒng)中(上位機(jī)每隔一定的時(shí)間向P LC發(fā)送命令,并從P LC中讀出數(shù)據(jù),經(jīng)現(xiàn)場運(yùn)行使用,該通信程序能快速、準(zhǔn)確地完成數(shù)據(jù)采集任務(wù)。在類CC ommunication的基礎(chǔ)之上封裝對M O2 DE M的控制函數(shù),從而實(shí)現(xiàn)了遠(yuǎn)程智能設(shè)備的串口通信,基于類CC ommunication的通信程序應(yīng)用于電能量數(shù)據(jù)采集系統(tǒng)中,充分發(fā)揮了
30、多線程的優(yōu)勢,能夠快速、準(zhǔn)確地完成對大量電能量數(shù)據(jù)的采集。參考文獻(xiàn):京:中國水利電力出版社,2000.NE LS ON M.Serial communication programmingM.T ranslat2 ed by X iaoxiang w orking studio.Beijing:Hydraulic and E lectric P ower Press,2000.2K RUG LI NSKI D J.Visual C+6.0技術(shù)內(nèi)幕M.希望圖書創(chuàng)作室譯.第5版.北京:北京希望電子出版社,1999.K RUG LI NSKI D J.Visual C+6.0ProgrammingM.T rans2 lated by H ope book w orking studio.5thed.Beijing:BeijingH ope E lectronic Press,1999.(責(zé)任編輯:汪儀珍作者簡介:李東曉(1975-,男,河南南陽人,碩士研究生,研究方向?yàn)殡娏ο到y(tǒng)運(yùn)行與控制(E2mail:lnldx;李曉明(1955-,男,湖北應(yīng)城人,教授,從事電力系統(tǒng)及其自動化專業(yè)的科研和教學(xué)工作;肖鯤(1978-,男,湖北荊州人,碩士研究生,研究方向?yàn)殡娏ο到y(tǒng)運(yùn)行與控制;張發(fā)忠(1978-,男,湖北隨州人,碩士研究
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)庫設(shè)計(jì)與實(shí)施試題及答案
- 快速記憶技巧與公路工程試題及答案
- 超市多元化支付方式與金融科技創(chuàng)新考核試卷
- 學(xué)會識別公路工程考試試題及答案技巧
- 保健食品行業(yè)供應(yīng)鏈金融創(chuàng)新考核試卷
- 金屬加工中的金屬成形技術(shù)考核試卷
- 谷物加工中的谷物粉碎與磨粉工藝考核試卷
- 谷物磨制工藝在食品產(chǎn)業(yè)可持續(xù)發(fā)展中的應(yīng)用考核試卷
- 行政組織理論的實(shí)務(wù)應(yīng)用與2025年試題及答案
- 大數(shù)據(jù)技術(shù)在媒體運(yùn)營中的價(jià)值試題及答案
- 2025年五金采購合同與價(jià)格明細(xì)
- 【初中生物】光合作用(第1課時(shí))課件-2024-2025學(xué)年人教版生物學(xué)七年級下冊
- 2025年高考語文古詩詞鑒賞主題閱讀與理解試題
- 樸樸北森測評試題及答案
- 中鐵建設(shè)面試試題及答案
- 2025年消控室考核試題及答案
- 衛(wèi)健系統(tǒng)2025年上半年安全生產(chǎn)工作總結(jié)
- 餐廳食材驗(yàn)收培訓(xùn)
- 麻精藥品規(guī)范化管理與使用
- 廬江縣2024-2025學(xué)年四下數(shù)學(xué)期末達(dá)標(biāo)測試試題含解析
評論
0/150
提交評論