用VC_設(shè)計(jì)多線程串行通信程序_第1頁
用VC_設(shè)計(jì)多線程串行通信程序_第2頁
用VC_設(shè)計(jì)多線程串行通信程序_第3頁
用VC_設(shè)計(jì)多線程串行通信程序_第4頁
用VC_設(shè)計(jì)多線程串行通信程序_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、收稿日期:1999207209作者簡介: 趙慶林 男,碩士研究生,主要從事信息工程與計(jì)算機(jī)控制的應(yīng)用研究; 呂振肅 男,教授,研究領(lǐng)域:非線性智能控制、魯棒控制和計(jì)算機(jī)應(yīng)用; 張 力 女,碩士,主要從事信息工程與計(jì)算機(jī)控制的應(yīng)用研究和DSP 的開發(fā)研究工作。用VC+設(shè)計(jì)多線程串行通信程序趙慶林 呂振肅 張 力 蘭州大學(xué)電子與信息科學(xué)系 甘肅#蘭州(730000摘 要 文中主要討論如何用通信控件和線程函數(shù)實(shí)現(xiàn)多任務(wù),并給出了VC+6.0下編寫通信線程的方法。關(guān)鍵詞 線程,多任務(wù),通信控件,同步中圖分類號(hào) TP312VC1 前言實(shí)時(shí)系統(tǒng)對(duì)多任務(wù)的要求比較普遍,典型的應(yīng)用是實(shí)時(shí)監(jiān)控系統(tǒng)要求后臺(tái)數(shù)據(jù)采

2、集。這時(shí)通信程序就要有一個(gè)線程專門負(fù)責(zé)數(shù)據(jù)采集,以實(shí)現(xiàn)實(shí)時(shí)多任務(wù)的需要。Windo ws 95引入的先進(jìn)技術(shù)之一就是線程。線程是Windo ws 95的唯一執(zhí)行單位,是Windo ws95為程序分配CPU 時(shí)間的基本實(shí)體。每個(gè)進(jìn)程由一個(gè)或多個(gè)線程組成(每個(gè)進(jìn)程至少有一個(gè)線程,而各個(gè)線程又可根據(jù)其調(diào)度優(yōu)先級(jí)分配CPU 時(shí)間以完成指定的操作,所以,W ind ow s95可依靠線程的優(yōu)先級(jí)和分配給線程的CPU 時(shí)間來調(diào)度線程以達(dá)到搶先多任務(wù)的目的。同一進(jìn)程中的多個(gè)線程,可以共享地址空間和所有的處理器資源,避免了用多進(jìn)程實(shí)現(xiàn)并行性的缺陷。通信程序可用VC+提供的通信控件編寫,這主要是由于控件簡潔實(shí)用

3、1,但當(dāng)實(shí)時(shí)性不能不考慮時(shí),控件要用到線程中就比較困難。因?yàn)榭丶仨毻系綄?duì)話框中使用,在線程中就不能像在對(duì)話框中那樣方便地使用控件進(jìn)行數(shù)據(jù)采集。本文就是針對(duì)這種情況討論如何在V C+6.0開發(fā)環(huán)境下,利用通信控件編寫后臺(tái)數(shù)據(jù)采集的工作線程,以實(shí)現(xiàn)實(shí)時(shí)多任務(wù)的操作。2 編寫工作線程WIN32應(yīng)用程序中的線程有兩種類型,一種是工作線程,一種是用戶接口線程。前者不處理窗口消息,常用于后臺(tái)執(zhí)行任務(wù),例如圖形繪制、磁盤讀寫、串行通信等費(fèi)時(shí)的操作。后者用來處理用戶輸入和響應(yīng)由用戶產(chǎn)生的事件和消息,它通過自己的消息泵獲得系統(tǒng)接收到的消息。我們編寫的通信線程使用工作線程,用于后臺(tái)數(shù)據(jù)采集。微軟基本類庫(Mic

4、roso ft Foundation Class MFC為多線程提供了三個(gè)全局函數(shù)A fxBegin Thread(,A fxGetThread(,和AfxEnd Thread(,它們的描述如表1所示:表1函 數(shù)描 述C winThread *AfxBe 2ginThread (AFX THRE ADPRIC pfnThreadProc,LPVOID pPara m,Int nPri 2ori ty =THR EAD PRIORI 2TY NOR MAL,UINTnS tackSize =0,DW ORDdwC reatFlags =0,LPS E C URITY A T 2TRIB UTES

5、 lpSecuri tyAttrs=N ULL創(chuàng)建一個(gè)工作新線程。返回值是指向新創(chuàng)建的線程對(duì)象的指針。C winThread *AfxGet 2Thread(調(diào)用此成員函數(shù)可獲得指向代表當(dāng)前執(zhí)行的線程的Cwi nThread 對(duì)象的指針,必須從所需的線程中調(diào)用此函數(shù)。Void Af xEndThread (UIN T nExitCode調(diào)用此成員函數(shù)來終止當(dāng)前的執(zhí)行線程。必須從將被終止的線程中調(diào)用此函數(shù)。在創(chuàng)建工作線程時(shí),應(yīng)首先編寫控制函數(shù)p fn 2ThreadProc,該函數(shù)入口點(diǎn)就是線程的啟動(dòng)點(diǎn),函數(shù)執(zhí)行完畢后,它所對(duì)應(yīng)的線程也立即終止。函數(shù)結(jié)構(gòu)為:UINT ThreadProc (LP

6、VOID pPram第20卷第1期2000年1月計(jì)算機(jī)應(yīng)用Computer Applications Vol.20,No.1Jan.2000while(1if(!mcom.Ge tPortOpen(/檢測(cè)端口是否打開。mcom.SetPortOpen(TRUE;mcom.SetOutput(COleVari ant(sendary;/向下位機(jī)發(fā)送存放在數(shù)組sendary下的數(shù)據(jù)。sendary.Rem oveAll(;Sleep(500;其中ThreadProc為函數(shù)名。PPram是一個(gè)32位值,它是在創(chuàng)建線程對(duì)象時(shí)傳遞給函數(shù)的值。對(duì)于工作線程來講,控制函數(shù)正常執(zhí)行到函數(shù)結(jié)束點(diǎn)后,相應(yīng)的工作線

7、程也就正常終止了。我們所編寫的通信線程函數(shù)是一個(gè)不斷向下位機(jī)發(fā)送數(shù)據(jù)的死循環(huán)過程,所以我們可以用函數(shù)A fxEndThread(來正常終止,但它只能在要終止的線程內(nèi)部自己調(diào)用。也可以在線程外使用TerminateThread(函數(shù)來強(qiáng)行終止線程。3創(chuàng)建通信控件在對(duì)話框中創(chuàng)建通信控件時(shí),我們是將通信控件從工具箱中拉到對(duì)話框中,而在線程函數(shù)中使用通信控件不同于在對(duì)話框下使用控件,在此應(yīng)該從菜單Pro ject|AddTo Project|File,下插入mscomm.h 文件和msco mm.cpp文件。這一對(duì)C+文件是通信控件本身所帶的類描述,只要在使用通信控件的任何項(xiàng)目文件標(biāo)簽下都可以找到。此

8、時(shí)你可以打開ClassView查看是否已加入到你的項(xiàng)目之中。然后,通過在MainFram中的O nCreat(函數(shù)下使用cm2 sco mm類的創(chuàng)建函數(shù),函數(shù)形式如下:BOO L C reate(LPC TS TR lpsz Window Name,D WORD dw Style, const REC T&rec t,CW nd*pParentWnd,UIN T nID,C File* pPersi st=NULL,B OO L bStorage=F ALSE,BS TR bstrLicKey =N ULL然后定義一個(gè)全局變量mcomm(C MSComm mco m,這時(shí)mco mm做

9、為通信控件對(duì)象就可對(duì)其屬性進(jìn)行設(shè)置。通信控件共提供了27個(gè)屬性,主要的屬性列舉如下:CommPort設(shè)置并返回通信口號(hào),缺省為CO M1,可設(shè)置116個(gè)。Settings設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位的字符串。其中波特率的范圍為300b/ s19200b/s。PortOpen設(shè)置并返回通信口的狀態(tài),同時(shí)可以用來打開和關(guān)閉通信口。InputLen決定每次Input讀入的字符個(gè)數(shù),缺省為0,表示讀取接收緩沖區(qū)的全部內(nèi)容。Input讀入并清除接收緩沖區(qū)的字符。InBufferCount返回接收緩沖區(qū)已接收的字符數(shù),通過置0可清除接收緩沖區(qū)。O utput將發(fā)送的字符串或數(shù)組寫到發(fā)送緩沖區(qū)

10、。InputMo de定義Inpput屬性獲得數(shù)據(jù)的方式(VC5.0新增屬性。Rthreshold設(shè)置、返回在通信控件置ComEvRe2 cieve并激發(fā)OnCo mm事件前要接收的字符數(shù)。SThreshold設(shè)置、返回通信控件置Co mEv Send 并激發(fā)OnCom m事件前發(fā)送緩沖區(qū)中的最少字符數(shù)。下面一段程序示范了如何用函數(shù)對(duì)通信控件的屬性進(jìn)行初始化設(shè)置。voi d C MainFrame:Initialize(mco m.SetSettings("9600,N,8,1"/設(shè)置通信參數(shù)mco m.SetC om mPort(2;/設(shè)置串口號(hào)mco m.SetInB

11、ufferSi ze(512;/設(shè)置接收緩沖區(qū)mco m.SetInB ufferC ount(0;/清除接收緩沖區(qū)mco m.SetInputMode(1;/設(shè)置接收模式mco m.SetInputLen(0;/設(shè)置接收方式因?yàn)榭丶怯珊瘮?shù)創(chuàng)建的,類向?qū)Р荒芄芾硐⒂成?所以必須在頭文件中手工添加,首先加入下面的聲明:afxm sg voi d OnCom m(;這個(gè)函數(shù)是定義通信事件的函數(shù),然后加入宏: DEC LAREEVENTSINKMAP(該宏是用來定義O LE事件映射的,在cpp文件中也要相應(yīng)加入:B EGINEVENTSINKMAP(C MainFram e,C Fra meW

12、ndONEVENT(C MainFram e,IDC O MM,1/*OnCom m*/, OnCom m,VTSN ONEENDEVENTSINKMAP(在程序中編寫OnCo mm(函數(shù),典型的格式如下:voi d C MainFrame:OnCom m(EnterCriticalS ection(&mcsS yn;/進(jìn)入臨界區(qū)。s witch(mcom.GetCom m Event(cas e2:/在此加入你要處理接收數(shù)據(jù)的程序。LeaveC riticalSection(&mcsSyn;/離開臨界區(qū)。此時(shí),就可以啟動(dòng)線程,調(diào)用控制函數(shù)往下位機(jī)發(fā)送數(shù)據(jù)而由OnCo mm(函

13、數(shù)響應(yīng)通信事件來完成數(shù)據(jù)的采集、處理任務(wù)。77第1期趙慶林等:用VC+設(shè)計(jì)多線程串行通信程序在驅(qū)動(dòng)程序中對(duì)硬盤加密許劍卓戴英俠左英男中國科技大學(xué)研究生院(北京信息安全國家重點(diǎn)實(shí)驗(yàn)室北京(100039摘要可移動(dòng)硬盤使用的日益廣泛,為保證硬盤在丟失時(shí)不造成嚴(yán)重的損失,有必要對(duì)硬盤加密。我們開發(fā)了N T和Win95下的硬盤驅(qū)動(dòng)程序,在該驅(qū)動(dòng)程序中直接對(duì)硬盤加密,只有持有密鑰的用戶才能夠訪問該硬盤。關(guān)鍵詞N T,驅(qū)動(dòng)程序,加密中圖分類號(hào)TP309.71概述可移動(dòng)硬盤的使用日益廣泛,由于硬盤上帶有的數(shù)據(jù)量比軟盤上的數(shù)據(jù)量要大的多,這種硬盤的丟失可能會(huì)對(duì)其主人造成很嚴(yán)重的影響,比如企業(yè)的商業(yè)秘密、科研單位

14、的研究成果以及軍事單位的各種保密信息等都必須保證其安全性。因此,有必要對(duì)硬盤進(jìn)行加密。我們?cè)赪indo us N T/95/98平臺(tái)下設(shè)計(jì)了硬盤的驅(qū)動(dòng)程序,使用該驅(qū)動(dòng)程序后,只有在用戶持有某個(gè)密鑰時(shí)才能訪問該硬盤,所有寫入該硬盤的數(shù)據(jù)或文件都自動(dòng)用密鑰加密,當(dāng)操作系統(tǒng)讀取硬盤時(shí)驅(qū)動(dòng)程序?qū)⒆詣?dòng)用該密鑰解密。這樣,在硬盤丟失時(shí)不會(huì)有任何泄密的危險(xiǎn),因?yàn)閷?duì)于沒有密鑰的用戶該硬盤中的信息完全是一堆毫無意義的信息。本文將以N T上的驅(qū)動(dòng)程序?yàn)槔枋鲈撥浖捏w系結(jié)構(gòu)。2N T驅(qū)動(dòng)程序的基本結(jié)構(gòu)在N T中,驅(qū)動(dòng)程序基本功能可描述為:驅(qū)動(dòng)程序是控制一定的系統(tǒng)資源、調(diào)用N T的系統(tǒng)服務(wù)函數(shù)為操作系統(tǒng)提供訪問該資

15、源的方法的程序。因此在設(shè)計(jì)驅(qū)動(dòng)程序時(shí)應(yīng)考慮三個(gè)要點(diǎn):#驅(qū)動(dòng)程序占有哪些資源,如何使用和訪問這些資源。這里的資源可以時(shí)中斷、D MA通道、IO端口、內(nèi)存、注冊(cè)表等。在我們的驅(qū)動(dòng)程序中,唯一需要使用的資源是內(nèi)存和注冊(cè)表;#驅(qū)動(dòng)程序可以調(diào)用哪些系統(tǒng)功能。在N T中, HA L層(硬件抽象層為訪問硬件提供了與平臺(tái)無關(guān)的訪問函數(shù),而涉及IO訪問、內(nèi)存分配、進(jìn)程管理以及配置信息的讀取等功能由Executive部件提供。一般使用DD K即可調(diào)用這些函數(shù)。具體將調(diào)用哪些函數(shù)我們將在第四小節(jié)中給出簡單說明;#驅(qū)動(dòng)程序應(yīng)給操作系統(tǒng)提供怎樣的接口。驅(qū)動(dòng)程序最終的目的是為操作系統(tǒng)提供訪問資源的服務(wù),操作系統(tǒng)怎樣訪問驅(qū)

16、動(dòng)程序即是驅(qū)動(dòng)程序的訪問規(guī)范。對(duì)于N T操作系統(tǒng)其訪問規(guī)范如下:在N T中,操作系統(tǒng)為每個(gè)驅(qū)動(dòng)程序生成一個(gè)由DRIV EROBJ結(jié)構(gòu)描述的D river對(duì)象。在該對(duì)象收稿日期:1999209220(修改稿作者簡介:許劍卓(1977-,碩士研究生,研究方向:計(jì)算機(jī)網(wǎng)絡(luò)安全;戴英俠(1942-,教授,研究方向:信息安全;左英男(1973-,碩士研究生,研究方向:計(jì)算機(jī)網(wǎng)絡(luò)安全。4結(jié)束語總之,通信控件可方便地實(shí)現(xiàn)微機(jī)的串行通信,再利用多線程則可以使通信任務(wù)實(shí)時(shí)性大大提高。只要掌握好控件的屬性和多線程函數(shù),就能輕松地編寫多任務(wù)的通信程序。此方法我們已經(jīng)在VC+ +6.0下與電力實(shí)時(shí)監(jiān)測(cè)儀表3720AC M的通信中試驗(yàn)成功。在此值得一提的是在多線程中最好使用同步類(CSncObject,CSemaphore,CMu tex,CCriticalSection 和CEv

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論