版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、收稿日期:1999207209作者简介: 赵庆林 男,硕士研究生,主要从事信息工程与计算机控制的应用研究; 吕振肃 男,教授,研究领域:非线性智能控制、鲁棒控制和计算机应用; 张 力 女,硕士,主要从事信息工程与计算机控制的应用研究和DSP 的开发研究工作。用VC+设计多线程串行通信程序赵庆林 吕振肃 张 力 兰州大学电子与信息科学系 甘肃#兰州(730000摘 要 文中主要讨论如何用通信控件和线程函数实现多任务,并给出了VC+6.0下编写通信线程的方法。关键词 线程,多任务,通信控件,同步中图分类号 TP312VC1 前言实时系统对多任务的要求比较普遍,典型的应用是实时监控系统要求后台数据采
2、集。这时通信程序就要有一个线程专门负责数据采集,以实现实时多任务的需要。Windo ws 95引入的先进技术之一就是线程。线程是Windo ws 95的唯一执行单位,是Windo ws95为程序分配CPU 时间的基本实体。每个进程由一个或多个线程组成(每个进程至少有一个线程,而各个线程又可根据其调度优先级分配CPU 时间以完成指定的操作,所以,W ind ow s95可依靠线程的优先级和分配给线程的CPU 时间来调度线程以达到抢先多任务的目的。同一进程中的多个线程,可以共享地址空间和所有的处理器资源,避免了用多进程实现并行性的缺陷。通信程序可用VC+提供的通信控件编写,这主要是由于控件简洁实用
3、1,但当实时性不能不考虑时,控件要用到线程中就比较困难。因为控件必须拖到对话框中使用,在线程中就不能像在对话框中那样方便地使用控件进行数据采集。本文就是针对这种情况讨论如何在V C+6.0开发环境下,利用通信控件编写后台数据采集的工作线程,以实现实时多任务的操作。2 编写工作线程WIN32应用程序中的线程有两种类型,一种是工作线程,一种是用户接口线程。前者不处理窗口消息,常用于后台执行任务,例如图形绘制、磁盘读写、串行通信等费时的操作。后者用来处理用户输入和响应由用户产生的事件和消息,它通过自己的消息泵获得系统接收到的消息。我们编写的通信线程使用工作线程,用于后台数据采集。微软基本类库(Mic
4、roso ft Foundation Class MFC为多线程提供了三个全局函数A fxBegin Thread(,A fxGetThread(,和AfxEnd Thread(,它们的描述如表1所示:表1函 数描 述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创建一个工作新线程。返回值是指向新创建的线程对象的指针。C winThread *AfxGet 2Thread(调用此成员函数可获得指向代表当前执行的线程的Cwi nThread 对象的指针,必须从所需的线程中调用此函数。Void Af xEndThread (UIN T nExitCode调用此成员函数来终止当前的执行线程。必须从将被终止的线程中调用此函数。在创建工作线程时,应首先编写控制函数p fn 2ThreadProc,该函数入口点就是线程的启动点,函数执行完毕后,它所对应的线程也立即终止。函数结构为:UINT ThreadProc (LP
6、VOID pPram第20卷第1期2000年1月计算机应用Computer Applications Vol.20,No.1Jan.2000while(1if(!mcom.Ge tPortOpen(/检测端口是否打开。mcom.SetPortOpen(TRUE;mcom.SetOutput(COleVari ant(sendary;/向下位机发送存放在数组sendary下的数据。sendary.Rem oveAll(;Sleep(500;其中ThreadProc为函数名。PPram是一个32位值,它是在创建线程对象时传递给函数的值。对于工作线程来讲,控制函数正常执行到函数结束点后,相应的工作线
7、程也就正常终止了。我们所编写的通信线程函数是一个不断向下位机发送数据的死循环过程,所以我们可以用函数A fxEndThread(来正常终止,但它只能在要终止的线程内部自己调用。也可以在线程外使用TerminateThread(函数来强行终止线程。3创建通信控件在对话框中创建通信控件时,我们是将通信控件从工具箱中拉到对话框中,而在线程函数中使用通信控件不同于在对话框下使用控件,在此应该从菜单Pro ject|AddTo Project|File,下插入mscomm.h 文件和msco mm.cpp文件。这一对C+文件是通信控件本身所带的类描述,只要在使用通信控件的任何项目文件标签下都可以找到。此
8、时你可以打开ClassView查看是否已加入到你的项目之中。然后,通过在MainFram中的O nCreat(函数下使用cm2 sco mm类的创建函数,函数形式如下: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然后定义一个全局变量mcomm(C MSComm mco m,这时mco mm做
9、为通信控件对象就可对其属性进行设置。通信控件共提供了27个属性,主要的属性列举如下:CommPort设置并返回通信口号,缺省为CO M1,可设置116个。Settings设置并返回波特率、奇偶校验、数据位、停止位的字符串。其中波特率的范围为300b/ s19200b/s。PortOpen设置并返回通信口的状态,同时可以用来打开和关闭通信口。InputLen决定每次Input读入的字符个数,缺省为0,表示读取接收缓冲区的全部内容。Input读入并清除接收缓冲区的字符。InBufferCount返回接收缓冲区已接收的字符数,通过置0可清除接收缓冲区。O utput将发送的字符串或数组写到发送缓冲区
10、。InputMo de定义Inpput属性获得数据的方式(VC5.0新增属性。Rthreshold设置、返回在通信控件置ComEvRe2 cieve并激发OnCo mm事件前要接收的字符数。SThreshold设置、返回通信控件置Co mEv Send 并激发OnCom m事件前发送缓冲区中的最少字符数。下面一段程序示范了如何用函数对通信控件的属性进行初始化设置。voi d C MainFrame:Initialize(mco m.SetSettings("9600,N,8,1"/设置通信参数mco m.SetC om mPort(2;/设置串口号mco m.SetInB
11、ufferSi ze(512;/设置接收缓冲区mco m.SetInB ufferC ount(0;/清除接收缓冲区mco m.SetInputMode(1;/设置接收模式mco m.SetInputLen(0;/设置接收方式因为控件是由函数创建的,类向导不能管理消息映射,所以必须在头文件中手工添加,首先加入下面的声明:afxm sg voi d OnCom m(;这个函数是定义通信事件的函数,然后加入宏: DEC LAREEVENTSINKMAP(该宏是用来定义O LE事件映射的,在cpp文件中也要相应加入: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(函数,典型的格式如下:voi d C MainFrame:OnCom m(EnterCriticalS ection(&mcsS yn;/进入临界区。s witch(mcom.GetCom m Event(cas e2:/在此加入你要处理接收数据的程序。LeaveC riticalSection(&mcsSyn;/离开临界区。此时,就可以启动线程,调用控制函数往下位机发送数据而由OnCo mm(函
13、数响应通信事件来完成数据的采集、处理任务。77第1期赵庆林等:用VC+设计多线程串行通信程序在驱动程序中对硬盘加密许剑卓戴英侠左英男中国科技大学研究生院(北京信息安全国家重点实验室北京(100039摘要可移动硬盘使用的日益广泛,为保证硬盘在丢失时不造成严重的损失,有必要对硬盘加密。我们开发了N T和Win95下的硬盘驱动程序,在该驱动程序中直接对硬盘加密,只有持有密钥的用户才能够访问该硬盘。关键词N T,驱动程序,加密中图分类号TP309.71概述可移动硬盘的使用日益广泛,由于硬盘上带有的数据量比软盘上的数据量要大的多,这种硬盘的丢失可能会对其主人造成很严重的影响,比如企业的商业秘密、科研单位
14、的研究成果以及军事单位的各种保密信息等都必须保证其安全性。因此,有必要对硬盘进行加密。我们在Windo us N T/95/98平台下设计了硬盘的驱动程序,使用该驱动程序后,只有在用户持有某个密钥时才能访问该硬盘,所有写入该硬盘的数据或文件都自动用密钥加密,当操作系统读取硬盘时驱动程序将自动用该密钥解密。这样,在硬盘丢失时不会有任何泄密的危险,因为对于没有密钥的用户该硬盘中的信息完全是一堆毫无意义的信息。本文将以N T上的驱动程序为例描述该软件的体系结构。2N T驱动程序的基本结构在N T中,驱动程序基本功能可描述为:驱动程序是控制一定的系统资源、调用N T的系统服务函数为操作系统提供访问该资
15、源的方法的程序。因此在设计驱动程序时应考虑三个要点:#驱动程序占有哪些资源,如何使用和访问这些资源。这里的资源可以时中断、D MA通道、IO端口、内存、注册表等。在我们的驱动程序中,唯一需要使用的资源是内存和注册表;#驱动程序可以调用哪些系统功能。在N T中, HA L层(硬件抽象层为访问硬件提供了与平台无关的访问函数,而涉及IO访问、内存分配、进程管理以及配置信息的读取等功能由Executive部件提供。一般使用DD K即可调用这些函数。具体将调用哪些函数我们将在第四小节中给出简单说明;#驱动程序应给操作系统提供怎样的接口。驱动程序最终的目的是为操作系统提供访问资源的服务,操作系统怎样访问驱
16、动程序即是驱动程序的访问规范。对于N T操作系统其访问规范如下:在N T中,操作系统为每个驱动程序生成一个由DRIV EROBJ结构描述的D river对象。在该对象收稿日期:1999209220(修改稿作者简介:许剑卓(1977-,硕士研究生,研究方向:计算机网络安全;戴英侠(1942-,教授,研究方向:信息安全;左英男(1973-,硕士研究生,研究方向:计算机网络安全。4结束语总之,通信控件可方便地实现微机的串行通信,再利用多线程则可以使通信任务实时性大大提高。只要掌握好控件的属性和多线程函数,就能轻松地编写多任务的通信程序。此方法我们已经在VC+ +6.0下与电力实时监测仪表3720AC M的通信中试验成功。在此值得一提的是在多线程中最好使用同步类(CSncObject,CSemaphore,CMu tex,CCriticalSection 和CEv
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论