《基于WindowsCE的串口通信的研究.pdf》由会员分享,可在线阅读,更多相关《基于WindowsCE的串口通信的研究.pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、732010 年 2 月第 2 期电子测试ELECTRONIC TESTFeb.2010No.273基于Windows CE的串口通信的研究韩雪连,王勇(南京邮电大学 南京 210003)摘要:Windows CE操作系统具备抢占式多任务功能以及强大的通信能力。串口通信是设备内部以及与外部设备连接的重要标准手段。本文探索如何在Windows CE嵌入式操作系统下实现串口通信。首先通过分析Windows CE操作系统自带的各种驱动源代码,提出以流驱动模式为策略的框架下具体开发该串口驱动程序的流程,实现串口驱动程序的定制与移植。然后分析串口应用程序的编写原理并使用eMbeded Visual C+
2、开发工具开发串口通信应用程序,以检验是否实现基于Windows CE操作系统的嵌入式产品与上位机之间串口通信。关键词:Windows CE嵌入式操作系统;流驱动;串口驱动;串口应用程序中图分类号:TP311.1 文献标识码:AExplore the principles of serial port communciation based on Windows CEHan Xuelian,Wang Yong(Nanjing university of Posts and Telecommunications Nanjing 210003)Abstract:Windows CE operatin
3、g system has preemptive multi-task capability and powerful communication ability.Serial port has become standard means of the connection of internal and external devices now.This paper is to explore how to fulfill serial port communication based on the Windows CE operating system.First through analy
4、zing sorts of drivers source codes in Windows CE operating system,proposes a new development workflow of serial device driver program to achive the designing and transplate of serial device drive program,which is based on the framework of stream driver model strategy.Then,it designs the application
5、program of serial port by the soft callded Embedded Visual C+.At last,to check Whether it fulfills the serial port communciation use this program.Keywords:Embedded OS-Windows CE;stream driver model strategy;serial driver program;the application program of serial port0 引言Windows CE 操作系统是微软针对嵌入式领域开发的一
6、个全新的操作系统,具备抢占式多任务功能以及强大的通信能力,广泛应用在信息设备、移动设备、电子产品以及嵌入式应用等非 PC 领域。IC Test Technology742010.2随着计算机技术、网络技术和多媒体通信技术的发展,嵌入式系统已经越来越走进普通人的生活,随之而来的,就是对嵌入式软、硬设计的广泛需要。串口通信是设备内部以及与外部设备连接的重要标准手段。本文介绍了在 Windows CE 嵌入式操作系统下进行串口设备驱动程序开发相关原理。通过分析该操作系统自带的各种驱动源代码,提出以流驱动模式为策略的框架下具体开发该串口驱动程序的流程。通过设计串口通信应用程序验证串口通信的正确性。1
7、硬件平台本文基于便携式检测仪开发项目,组成该项目的硬件包括嵌入式主控模块(相当于 PC),采用CPU:PX270 处理器,主频为 520MHz;内存容量:512MB;显示采用 TFT 5.6 寸真彩液晶屏,分辨率为 640480 的屏显示;存储器:512MB FLASH 存储器。检测仪的串口主要用来和外部仪器连接,通过给被测仪器发送命令,检测仪判断被测仪器的回送数据来检测被测仪器的性能是否正常。硬件检测连接图如图 1 所示。图1 测量外部连接图 2 软件开发平台操作系统:Windows CE 操作系统;驱动程序定制软件:PlatformBuilder;应用程序编译器:EVC+。软件检测过程的原
8、理如图 2 所示。图2 测量过程软件流程图3 设备驱动开发和移植Windows CE 的设备驱动模型共有 2 种:流接口驱动和本地设备驱动。两者的区别主要在于它们向上提供的编程接口不同:流接口驱动提供一组通用的接口;而本地设备驱动可以根据设备的具体要求提供相应的接口。计算机系统中,很多硬件设备都在不断地制造或使用二进制数据。这些设备可以被抽象成流式设备,最典型的例子就是串口。在使用串口时,二进制数据像流水一样,从一台设备经过串口流到另外一台设备。3.1 串口驱动的实现3.1.1 串口驱动的工作流程当驱动程序被上层应用程序调用(或由操作系统加载)时,开始进行初始化工作,包括串口初始化、创建各种控
9、制量和串口监听线程等。然后应用程序打开通信端口,并调用 DeviceIoControl 函数对驱动程序进行属性设置等工作,驱动程序在创建串口监视线程后,由 ReadFile 和 WriteFile 完成对串口的读写操作,并通过 Com_Read()和 Com_Write()函数与应用程序进行数据交互。首先构造驱动程序中所必需的接口函数,然后便携式检测仪被测外部设备(上位机)串口连接线检测仪串口被测仪器串口便携式检测仪通过串口发送检测命令接收来自被测设备的检测结果判断接收到的数据,进而判断检测仪的状态在显示屏上显示检测结果被测外部设备(上位机)根据接收到的命令进行自检串口接收到检测命令通过串口回
10、送检测的结果(1)通过串口发送(2)通过串口回送集成电路测试技术752010.2在驱动程序运行的各个阶段来扩展相应的函数功能,概括起来主要分成以下几个部分:驱动程序的加载和初始化、创建通信端口、属性设置、数据通信以及最后的驱动卸载。串口驱动的工作流程包括 5 个步骤:驱动程序加载及初始化过程当操作系统启动后,系统设备管理程序(device.exe)自动加载驱动程序,并通过 COM_Init 接口函数来完成驱动程序初始化工作。Windows CE 中,一个串口被初始化前 MDD 层会先调用 GetSerialObject()函数得到串口驱动程序中实现的串口设备数目。因此在串口驱动程序的初始化时,
11、由如下代码实现:HWOBJ SerObj1=/*描述串口特征*/THREAD_AT_INIT,SYSINTR_SERIAL,/*中断处理全部由PDD 层处理*/(PHW_VTABL)&XSC1_SerVTbl /*包含所需要实现的所有标准串口 DDSI 函数的列表*/;然 后 通 过 函 数 GetSerialObject(DWORD DeviceArrayIndex)得 到 所 需 要 的 端 口 数,其 中DeviceArrayIndex 对应的每个串口的端口数,可从注册表中读出。创建通信端口当上层应用程序调用 CreateFile 函数打开通信端口时,驱动程序调用 COM_Open 函数
12、创建与上层应用进行通信的管道。该通信的管道通过一种称为设备上下文结果 COM_CONTEXT 来实现,每个设备上下文对应一个上层应用程序,并为该应用程序分配一个输入输出缓冲区存储收发的数据,同时用户可以在这个结构中设置各种通信控制量。其代码如下:H A N D L E C O M _ O p e n(H A N D L E pHead,DWORD AccessCode,DWORD ShareMode)hCommEvent=CreateEvent(NULL,FALSE,FALSE,NULL);/*产生串口发生事件,用于勾挂中断*/接下来舒适化 DCB 数据结构pSerialHead-DCB.DC
13、Blength=sizeof(DCB);ApplyDCB();/将所建立的线程和中断通过事件进行勾挂InterruptInitialize(IntID,hCommEvent);/打开串口HWOpen(pSerialHead-pHWHead);/清空接收缓冲区H W P u r g e C o m m(p H W H e a d,P U R G E _RXCLEAR);/清除标志位Memset(RxBufferInfo.RxCharBuffer,0,length);通信端口属性设置当驱动程序为上层应用创建了通信端口后并不知道上层应用的标志,上层应用程序需要通过某种方式向驱动程序声明自己的身份,驱
14、动程序是依靠端口号来区分数据所属的业务,从而将数据正确地送到相对应的应用程序。DeviceIOControl 函数提供了上层应用与驱动程序进行简单通信的功能。当上层应用调用 DeviceIOControl 函数时,驱动程序通过COM_IOControl 接口函数响应上层操作,因此用户可以在这个函数内完成一些端口的属性设置。数据通信经过前面的设置和初始化,驱动程序为上层应用与串口之间提供了相互通信的条件,当上层应用IC Test Technology762010.2调用 ReadFile 和 WriteFile 函数进行数据读写操作时,驱动程序通过 COM_Read 和 COM_Write 接口
15、函数响应上层操作。在驱动程序加载时创建了串口监视线程,当串口有数据到达时,监视线程读取数据,并根据数据格式存储到响应的设备上下文数据缓冲区中,同时通过通信控制量通知 COM_Read 接口函数读取数据,而上层应用通过 ReadFile 获取数据。当应用程序调用 WriteFile 发送数据时,驱动程序通过 COM_Write 函数获得数据,并且按照通信格式打包(对应该上层应用)后交给串口发送。关闭端口与驱动卸载当上层应用完成任务需要关闭时,需要调用CloseHandle 关闭通信。3.1.2中断处理与流量控制设计串口驱动时,需重点注意几个问题,首先是中断的处理。串口驱动程序中最主要的处理就是中
16、断服务函数,该函数主要完成接收中断、发送中断以及流控制中断的处理。其主要的流程如图3所示。图3 串口中断处理流程由于我们所采用的 UART 控制芯片中带有FIFO,为了保证及时接收,接收中断中必须循环处理接收字符直到接收 FIFO 为空。同时,为了同步接收方和发送方的速率,即接收方不被发送方淹没,接收缓冲区剩余空间不足时应立刻启动硬件流控,设置 RTS 为 0。等上层提取了缓冲区中的数据,腾出足够的空间后再取消硬件流控,恢复接收。对于发送,为了减少发送中断的产生次数,也采用在一次中断服务中,循环发送字符知道软件缓冲区为空的方法。但是,在提取发送缓冲区的数据时需要注意判断软件信号量,以防止缓冲区
17、的争用。同时,还要判断接收方是否已启动流控,即判断nTxAStop 的值。流控中断的处理,首先要判断流控类型为停止发送还是允许发送。若为停止发送,只需简单地将软件标志 nTxStop 设置为 1 即可;若为允许发送,处理要将 nTxStop 置为 0,还要主动从发送缓冲区中取出字符发送,以触发发送中断,使硬件立刻恢复发送。否则,要等到下一次应用层调用发送接口函数时,硬件才恢复发送。流控分为接收流控和发送流控。接收流控:在接收中断服务函数中,若接收缓冲剩余空间不足,必须将 CTS 置为 0,以通知对方停止发送;当上层通过接口函数 ReadFile()提取数据时,若接收缓冲的空闲空间超过临界值,则
18、必须将 CTS 置为 1,通知对方恢复发送。最需要注意的问题是,当开启接收流控时,对方可能已经发出了几个字符,因此流控后可能还是会产生几次接收中断,对于收到的字符必须处理,否则接收中断将无法消失,程序一直陷入接收中断中。发送流控:当 RTS 变为无效时,表明对方来不及接收,驱动程序必须立刻停止发送。此时发送中断服务函数不能再发送字符,上层串口发送的接口函数 WriteFile 的返回值也应变为 0,以通知应用程序减慢对串口发送接口函数的调用速度。当 RTS变为有效时,驱动程序应该立即采用主动触发的方开始读取串口中断判断中断类型接收中断处理流控中断处理发送中断处理还有未处理的中断否结束发送中断接
19、收中断,接收超时NY集成电路测试技术772010.2法恢复发送,且中断服务函数和接口函数 WriteFile即恢复正常。通过流控标志变量,可使得中断服务函数和接口函数能随即对流控做出反映,实现流控的功能。3.2 串口的使用Windows CE 下的串口驱动属于流驱动模型,是分层的驱动程序,分为 MDD 层和 PDD 层,它与操作系统接口为 DDI,它是通过 Device.exe 之间的接口,串口驱动的 DDI 函数为 COM_Init,COM_Open,COM_Close,COM_Read,COM_Write,COM_PowerDown,COM_PowerUp,COM_Deinit,COM_I
20、OControl,根据不同的硬件电路在板级支持包中实现串口驱动的 DDSI 接口函数,即为PDD 层的函数,它和具体的硬件有关。具体使用流程如下:首先是打开串口:打开串口使用 CreateFile 函数。在设计中打开串口(注册表中已设置号端口号)方法如下:/打开 COM1 端口GetRegistrySZ(HKEY_LOCAL_MACHINE,g_tszRegKeyRIL,TEXT(“ComPort”),tszComName,1);m_hDownstream=CreateFile(tszComName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING
21、,dwFlags,NULL);串口打开后,还必须对串口进行配置。通过GetCommState 和 SetCommState 函数可以实现这点。其中关键是配置一个 DCB 结构,该结构有 28 个参数,可以通过调用 GetCommState 或得该结构的一部分参数属性值,然后根据需要改变其中的一些属性值。然 后,还 应 该 设 置 串 口 读 写 操作 的 超 时 参 数 值,这 个 参 数 可 以 通 过GetCommTimeouts 和 SetCommTimeouts 函数做 到,其 关 键 是 COMMTIMEOUTS 结 构 的配 置。ReadIntervalTimeouts 设 置 通
22、 信 上 接 收两 个 字 符 间 隔 的 时 间 最 大 值,单 位 为 毫 秒;ReadTotalTimeoutMultiplier 设置串口读操作超时的最大值,单位为毫秒;WriteTotalTimeoutMultiplier用于设置写操作的超时参数值的基数,用于计算写操作的超时参数值;WriteTotalTimeoutConstant 设置一个常数,用于计算总的写操作超时参数值;然后调用 EscapeCommFunction(hPort,SETDTR)向串口发送数据中断准备好信号,和 EscapeCommFunction(hPort,SETRTS)发送请求发送数据信号,表示串口准备好,
23、可以发送数据。下面可以进行串口的读写。串口的写操作比较简单,调用 WriteFile 函数即可。串口的读操作相对比较麻烦。如果采用死循环不停的读串口,则会占用大量的 CPU 资源,甚至可能会使程序处于死锁状态。如果采用查询的方式,则不能够保证传输的数据不丢失,所以最好有一个类似中断的中断服务程序。在 Windows CE 中可以采用多线程来解决这个问题。用多线程的技术解决串口数据接收的问题,主要有两个难点:什么时候创建线程和在多线程中如何实现数据接收。由于创建的线程是用来接收串口数据的,所以应该在串口参数配置好,串口被打开后就可以创建接收线程。如果串口没有打开就创建接收线程,就会浪费系统资源,
24、具体的串口通信的实现方法:首先建立一个串口通信的类 CPSerialPort,类中 提 供 了 类 将 提 供 4 个 共 有 方 法(OpenPort,ClosePort,ReadPort,WritePort)和 一 个 函 数 指 针*LPDataArriveProc;OpenPort:用于根据指定的参数打开串口,并创建读,写线程来异步读写串口;ClosePort:用于关闭串口释放的资源,同时也IC Test Technology782010.2关闭读写线程;ReadPort:读取一定长度的数据;WritePort:用于向串口写数据。图4 串口通信流程图在主程序中需要调用这个串口类中的公共
25、函数,并把相应的函数 OnDataArrive 传递给函数指针LPDataArriveProc,这个传递过程通过打开串口的时候传递给串口类,在串口打开后,串口的读线程即进入监控有无数据到达串口的状态,当有数据到达串口时,读线程触发主程序中的函数调用。主程序中 OnDataArrive 函数负责发送一个数据消息,通过消息映射机制可以触发主程序中消息到达后处理数据的函数 OnDataArrivedMsg;具体的函数映射关系如下:首先定义一个用户自定义的消息:#define WM_NEW_DATA_ARRIVE WM_USER+1OnDataArrive 函数的是实现:void CSerialPor
26、tDlg:OnDataArrive(char*data,int length,DWORD userdata)CSerialPortDlg*pWnd=(CSerialPortDlg*)userdata;:SendMessage(pWnd-m_hWnd,WM_NEW_DATA_ARRIVE,(WPARAM)data,LPARAM(length);当 OnDataArrive 函数被触发调用时将发送用户自定义的消息到主窗口,窗口接收到消息通过消 息 映 射:ON_MESSAGE(WM_NEW_DATA_ARRIVE,OnDataArrivedMsg)可以调用消息处理函数 OnDataArrivedM
27、sg 来处理接收到的数据,在这里可以通过一个控件显示接收到的数据,完成本次数据的接收。本实例的软件设计中,采用基于 Dialog的 MFC 设计,通过控件可以用户自行设定打开串口的方式,以及发送的数据。应用程序运行界面如图 5 所示。图5 串口应用程序运行界面3.3 串口通信的检测按照流驱动模型设计串口驱动程序,运行应用程序并通过串口调试助手来检测串口是否完成与上位机的通信。检验方法及步骤:1)把需要测试的串口与上位机的串口通过串口线相连,如图 1-1 所示;2)运行串口测试应用程序,如图 3-3 所示。3)通过应用程序的“设置”按钮可以设置打开串口号,串口的波特率,停止位,起始位,流控方式等
28、串口设置信息,可以根据设备串口通信的协议进行设置串口打开的方式;然后打开串口,在发1,调用OpenPort打开串口读线程写线程2,LPDataArriveProc2,调用WritePort方法向串口写数据3,使用完毕后,调用ClosePort关闭串口,同时将先关闭读,写线程此时,创建读线程此时,创建写线程当检测到串口有可读数据后,通过函数指针通知外部处理,此时发送一个线程消息,通知写线程向串口写数据集成电路测试技术792010.2送区通过软键盘输入要发送的命令,点击“发送”按钮即可向上位机发送测试命令。4)点击“接收”按钮,可以接收到来自串口的回送数据,用户可以在接收到数据后进行处理,判断测试
29、的结果,并把结果显示出来。4 结论串口通信称为整机内部通信以及整机与外部计算机通信的重要标准手段,而嵌入式系统又被广泛应用,所以以 Windows CE 操作系统的嵌入式产品具备串口通信称为一个嵌入式产品必须具备的功能。因此本论文的研究内容具有很大的理论意义以及实际的应用价值。参考文献1 邱小平.Windows CE6.0 开发经典 M.北京:电子工业出版社,2009:163-179.2 李志明.嵌入式系统的设计方法分析 M.上海:上海交通大学出版社,2003:35-54.3 李现勇.Viusa1C+串口通信技术与工程实践 M.北京:人民邮电出版社,2002.4 王剑.Windows CE 下
30、的串口通信的实现 J.单片机与嵌入式系统应用,2003.5 张冬泉,谭南林,王雪梅 Windows CE 实用开发技术 M.北京:电子工业出版社 2006:286-290,312-313.6 田东风.WindowsCE 应用程序设计 M.北京:机械工业出版社,2003:31-48,290-299.7 傅曦,齐宇.嵌入式系统 Windows CE 开发技巧与实例 M.北京:化学工业出版社,2004:140-149.8 微软公司.Microsoft Windows CE Device driver Kit 设备驱动程序开发指南 M.北京:希望电子出版社1999:25-35,77-93.9 何宗键.Windows CE 嵌入式系统 M.北京:北京航空航天大学出版社,2006:194-204,225-235,258-273.作者简介:韩雪连,南京邮电大学硕士研究生,主要研究方向为虚拟仪器在通信信息系统中的应用。E-mail:han_xue_王勇,教授,博士,南京邮电大学大学实验中心主任。主要研究方向为虚拟仪器,测量与控制技术,各类通信网检测,监控与管理。E-mail: