韩雪连 ,王勇
( 南京邮电大学 南京 210003)
摘要:Windows CE操作系统具备抢占式多任务功能以及强大的通信能力。串口通信是设备内部以及与外部设备连接的重要标准手段。本文探索如何在Windows CE嵌入式操作系统下实现串口通信。首先通过分析Windows CE操作系统自带的各种驱动源代码,提出以流驱动模式为策略的框架下具体开发该串口驱动程序的流程,实现串口驱动程序的定制与移植。然后分析串口应用程序的编写原理并使用eMbeded Visual C++开发工具开发串口通信应用程序,以检验是否实现基于Windows CE操作系统的嵌入式产品与上位机之间串口通信。
关键词:Windows CE嵌入式操作系统;流驱动;串口驱动;串口应用程序中图分类号:TP311.1 文献标识码:A
Explore the principles of serial port communciation
based on Windows CE
Han Xuelian,Wang Yong
(Nanjing university of Posts and Telecommunications Nanjing 210003)
Abstract:Windows CE operating 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 analyzing sorts of driver’s 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 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 port
0 引言
Windows CE操作系统是微软针对嵌入式领域
开发的一个全新的操作系统,具备抢占式多任务功能以及强大的通信能力,广泛应用在信息设备、移动设备、电子产品以及嵌入式应用等非PC领域。
732010.2IC Test Technology便携式检测仪通过串口发送检测命令被测外部设备(上位机)
随着计算机技术、网络技术和多媒体通信技术的发展,嵌入式系统已经越来越走进普通人的生活,随之而来的,就是对嵌入式软、硬设计的广泛需要。串口通信是设备内部以及与外部设备连接的重要标准手段。本文介绍了在Windows CE嵌入式操作系统下进行串口设备驱动程序开发相关原理。通过分析该操作系统自带的各种驱动源代码,提出以流驱动模式为策略的框架下具体开发该串口驱动程序的流程。通过设计串口通信应用程序验证串口通信的正确性。
(1)通过串口发送 接收来自被测设备的检(2)测结果通过串口回判断接收到的数据,进送而判断检测仪的状态串口接收到检测命令根据接收到的命令进行自检在显示屏上显示检测结果通过串口回送检测的结果图2 测量过程软件流程图
3 设备驱动开发和移植
1 硬件平台
Windows CE的设备驱动模型共有2种:流接
本文基于便携式检测仪开发项目,组成该项目的硬件包括嵌入式主控模块(相当于PC),采用CPU:PX270处理器,主频为520MHz;内存容量:512MB;显示采用TFT 5.6寸真彩液晶屏,分辨率为0×480的屏显示;存储器:512MB FLASH存储器。检测仪的串口主要用来和外部仪器连接,通过给被测仪器发送命令,检测仪判断被测仪器的回送数据来检测被测仪器的性能是否正常。硬件检测连接图如图1所示。
检测仪串口
便携式检测仪
被测仪器串口
被测外部设备
(上位机)
口驱动和本地设备驱动。两者的区别主要在于它们向上提供的编程接口不同:流接口驱动提供一组通用的接口;而本地设备驱动可以根据设备的具体要求提供相应的接口。计算机系统中,很多硬件设备都在不断地制造或使用二进制数据。这些设备可以被抽象成流式设备,最典型的例子就是串口。在使用串口时,二进制数据像流水一样,从一台设备经过串口流到另外一台设备。
3.1 串口驱动的实现
3.1.1 串口驱动的工作流程当驱动程序被上层应用程序调用(或由操作系
串口连接线
图1 测量外部连接图
统加载)时,开始进行初始化工作,包括串口初始化、创建各种控制量和串口监听线程等。然后应用程序打开通信端口,并调用DeviceIoControl函数对驱动程序进行属性设置等工作,驱动程序在创建串口监
2 软件开发平台
操作系统:Windows CE操作系统;驱动程序定制软件:PlatformBuilder;应用程序编译器:EVC++。软件检测过程的原理如图2所示。74视线程后,由ReadFile和WriteFile完成对串口的读写操作,并通过Com_Read()和Com_Write()函数与应用程序进行数据交互。
首先构造驱动程序中所必需的接口函数,然后
集成电路测试技术在驱动程序运行的各个阶段来扩展相应的函数功能,如下:概括起来主要分成以下几个部分:驱动程序的加载和初始化、创建通信端口、属性设置、数据通信以及最后的驱动卸载。
串口驱动的工作流程包括5个步骤:⑴ 驱动程序加载及初始化过程
当操作系统启动后,系统设备管理程序(device.exe)自动加载驱动程序,并通过COM_Init接口函数来完成驱动程序初始化工作。
Windows CE中,一个串口被初始化前MDD层会先调用GetSerialObject()函数得到串口驱动程序中实现的串口设备数目。因此在串口驱动程序的初始化时,由如下代码实现:
HWOBJ SerObj1=/*描述串口特征*/{
THREAD_AT_INIT,
SYSINTR_SERIAL, /*中断处理全部由PDD层处理*/
(PHW_VTABL)&XSC1_SerVTbl /*包含所需要实现的所有标准串口DDSI函数的列表*/
};
然后通过函数GetSerialObject(DWORD DeviceArrayIndex)得到所需要的端口数,其中DeviceArrayIndex对应的每个串口的端口数,可从注册表中读出。
⑵ 创建通信端口
当上层应用程序调用CreateFile函数打开通信端口时,驱动程序调用COM_Open函数创建与上层应用进行通信的管道。该通信的管道通过一种称为设备上下文结果COM_CONTEXT来实现,每个设备上下文对应一个上层应用程序,并为该应用程序分配一个输入输出缓冲区存储收发的数据,同时用户可以在这个结构中设置各种通信控制量。其代码
2010.2HANDLE COM_Open(HANDLE pHead,DWORD AccessCode,DWORD ShareMode)
{ ……
hCommEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
/*产生串口发生事件,用于勾挂中断*///接下来舒适化DCB数据结构
pSerialHead->DCB.DCBlength=sizeof(DCB);……ApplyDCB();
//将所建立的线程和中断通过事件进行勾挂InterruptInitialize(IntID,hCommEvent);//打开串口
HWOpen(pSerialHead->pHWHead);//清空接收缓冲区
HWPurgeComm(pHWHead,PURGE_RXCLEAR);//清除标志位
Memset(RxBufferInfo.RxCharBuffer,0,length);}
⑶ 通信端口属性设置
当驱动程序为上层应用创建了通信端口后并不知道上层应用的标志,上层应用程序需要通过某种方式向驱动程序声明自己的身份,驱动程序是依靠端口号来区分数据所属的业务,从而将数据正确地送到相对应的应用程序。DeviceIOControl函数提供了上层应用与驱动程序进行简单通信的功能。当上层应用调用DeviceIOControl函数时,驱动程序通过COM_IOControl接口函数响应上层操作,因此用户可以在这个函数内完成一些端口的属性设置。
⑷ 数据通信
经过前面的设置和初始化,驱动程序为上层应用与串口之间提供了相互通信的条件,当上层应用
752010.2IC Test Technology步接收方和发送方的速率,即接收方不被发送方淹没,接收缓冲区剩余空间不足时应立刻启动硬件流控,设置RTS为0。等上层提取了缓冲区中的数据,腾出足够的空间后再取消硬件流控,恢复接收。
对于发送,为了减少发送中断的产生次数,也采用在一次中断服务中,循环发送字符知道软件缓冲区为空的方法。但是,在提取发送缓冲区的数据时需要注意判断软件信号量,以防止缓冲区的争用。同时,还要判断接收方是否已启动流控,即判断nTxAStop的值。
流控中断的处理,首先要判断流控类型为停止发送还是允许发送。若为停止发送,只需简单地将软件标志nTxStop设置为1即可;若为允许发送,处理要将nTxStop置为0,还要主动从发送缓冲区中取出字符发送,以触发发送中断,使硬件立刻恢复发送。否则,要等到下一次应用层调用发送接口函数时,硬件才恢复发送。流控分为接收流控和发
调用ReadFile 和WriteFile函数进行数据读写操作时,驱动程序通过COM_Read和COM_Write接口函数响应上层操作。在驱动程序加载时创建了串口监视线程,当串口有数据到达时,监视线程读取数据,并根据数据格式存储到响应的设备上下文数据缓冲区中,同时通过通信控制量通知COM_Read接口函数读取数据,而上层应用通过ReadFile获取数据。当应用程序调用WriteFile发送数据时,驱动程序通过COM_Write函数获得数据,并且按照通信格式打包(对应该上层应用)后交给串口发送。
⑸ 关闭端口与驱动卸载
当上层应用完成任务需要关闭时,需要调用CloseHandle关闭通信。
3.1.2中断处理与流量控制设计串口驱动时,需重点注意几个问题,首先是中断的处理。串口驱动程序中最主要的处理就是中断服务函数,该函数主要完成接收中断、发送中
断以及流控制中断的处理。其主要的流程如图3所示。送流控。
开始◆接收流控:在接收中断服务函数中,若接收缓冲剩余空间不足,必须将CTS置为0,以通知对
读取串口中断方停止发送;当上层通过接口函数ReadFile()提取数据时,若接收缓冲的空闲空间超过临界值,则必
判断中断类型Y接收中断,接收超时接收中断处理流控中断处理发送中断发送中断处理须将CTS置为1,通知对方恢复发送。最需要注意的问题是,当开启接收流控时,对方可能已经发出了几个字符,因此流控后可能还是会产生几次接收中断,对于收到的字符必须处理,否则接收中断将
还有未处理的中断否N无法消失,程序一直陷入接收中断中。
◆发送流控:当RTS变为无效时,表明对方来不及接收,驱动程序必须立刻停止发送。此时发送中断服务函数不能再发送字符,上层串口发送的接口函数WriteFile的返回值也应变为0,以通知应用程序减慢对串口发送接口函数的调用速度。当RTS变为有效时,驱动程序应该立即采用主动触发的方
结束图3 串口中断处理流程
由于我们所采用的UART控制芯片中带有FIFO,为了保证及时接收,接收中断中必须循环处理接收字符直到接收FIFO为空。同时,为了同76集成电路测试技术法恢复发送,且中断服务函数和接口函数WriteFile即恢复正常。通过流控标志变量,可使得中断服务函数和接口函数能随即对流控做出反映,实现流控的功能。
2010.2做到,其关键是COMMTIMEOUTS结构的配置。ReadIntervalTimeouts设置通信上接收两个字符间隔的时间最大值,单位为毫秒;ReadTotalTimeoutMultiplier设置串口读操作超时的最大值,单位为毫秒; WriteTotalTimeoutMultiplier
3.2 串口的使用
是分层的驱动程序,分为MDD层和PDD层,它与操作系统接口为DDI,它是通过Device.exe之间的接口,串口驱动的DDI函数为COM_Init,COM_Open,COM_Close,COM_Read,COM_Write,COM_PowerDown,COM_PowerUp,COM_Deinit,
COM_IOControl,根据不同的硬件电路在板级支持包中实现串口驱动的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,dwFlags,NULL);
串口打开后,还必须对串口进行配置。通过
用于设置写操作的超时参数值的基数,用于计算写
Windows CE下的串口驱动属于流驱动模型,操作的超时参数值;WriteTotalTimeoutConstant设置
一个常数,用于计算总的写操作超时参数值;然后调用EscapeCommFunction(hPort,SETDTR)向串口发送数据中断准备好信号,和EscapeCommFunction(hPort,SETRTS)发送请求发送数据信号,表示串口准备好,可以发送数据。
下面可以进行串口的读写。串口的写操作比较简单,调用WriteFile函数即可。串口的读操作相对比较麻烦。如果采用死循环不停的读串口,则会占用大量的CPU资源,甚至可能会使程序处于死锁状态。如果采用查询的方式,则不能够保证传输的数据不丢失,所以最好有一个类似中断的中断服务程序。在Windows CE中可以采用多线程来解决这个问题。用多线程的技术解决串口数据接收的问题,主要有两个难点:什么时候创建线程和在多线程中如何实现数据接收。
由于创建的线程是用来接收串口数据的,所以应该在串口参数配置好,串口被打开后就可以创建接收线程。如果串口没有打开就创建接收线程,就
GetCommState和SetCommState函数可以实现这点。会浪费系统资源,具体的串口通信的实现方法:其中关键是配置一个DCB结构,该结构有28个参数,可以通过调用GetCommState或得该结构的一部分参数属性值,然后根据需要改变其中的一些属性值。
然后,还应该设置串口读写操作的超时参数值,这个参数可以通过GetCommTimeouts和SetCommTimeouts函
数
首先建立一个串口通信的类CPSerialPort,类中提供了类将提供4个共有方法(OpenPort, ClosePort, ReadPort,WritePort)和一个函数指针*LPDataArriveProc;
OpenPort:用于根据指定的参数打开串口,并创建读,写线程来异步读写串口;
ClosePort:用于关闭串口释放的资源,同时也
772010.2IC Test Technology::SendMessage(pWnd->m_hWnd,WM_NEW_DATA_ARRIVE,(WPARAM)data,LPARAM(length));
}
当OnDataArrive函数被触发调用时将发送用
2,LPDataArriveProc当检测到串口有可读数据后,通过函数指针通知外部处理此时,创建读线程读线程关闭读写线程;
ReadPort:读取一定长度的数据;WritePort:用于向串口写数据。
户自定义的消息到主窗口,窗口接收到消息通过消息映射:ON_MESSAGE(WM_NEW_DATA_ARRIVE,OnDataArrivedMsg)可以调用消息处理函
1,调用OpenPort打开串口 此时,创建写线程写线程数OnDataArrivedMsg来处理接收到的数据,在这里可以通过一个控件显示接收到的数据,完成本次数据的接收。本实例的软件设计中,采用基于Dialog的MFC设计,通过控件可以用户自行设定打开串
此时,发送一个线程消息,通知写线程向串口写数据2,调用WritePort方法向串口写数据3,使用完毕后,调用ClosePort关闭串口,同时将先关闭读,写线程口的方式,以及发送的数据。应用程序运行界面如图5所示。
图4 串口通信流程图
在主程序中需要调用这个串口类中的公共函数,并把相应的函数OnDataArrive传递给函数指针LPDataArriveProc,这个传递过程通过打开串口的时候传递给串口类,在串口打开后,串口的读线程即进入监控有无数据到达串口的状态,当有数据到达串口时,读线程触发主程序中的函数调用。
主程序中OnDataArrive函数负责发送一个数据消息,通过消息映射机制可以触发主程序中消息到达后处理数据的函数OnDataArrivedMsg;具体的函数映射关系如下:
首先定义一个用户自定义的消息:
#define WM_NEW_DATA_ARRIVE WM_USER+1
OnDataArrive函数的是实现:
void CSerialPortDlg::OnDataArrive(char *data,int length,DWORD userdata)
{
CSerialPortDlg *pWnd=(CSerialPortDlg *)userdata;78图5 串口应用程序运行界面
3.3 串口通信的检测
按照流驱动模型设计串口驱动程序,运行应用程序并通过串口调试助手来检测串口是否完成与上位机的通信。检验方法及步骤:
1) 把需要测试的串口与上位机的串口通过串口线相连,如图1-1所示;
2) 运行串口测试应用程序,如图3-3所示。3) 通过应用程序的“设置”按钮可以设置打开串口号,串口的波特率,停止位,起始位,流控方式等串口设置信息,可以根据设备串口通信的协议进行设置串口打开的方式;然后打开串口,在发
集成电路测试技术送区通过软键盘输入要发送的命令,点击“发送”按钮即可向上位机发送测试命令。
4) 点击“接收”按钮,可以接收到来自串口的回送数据,用户可以在接收到数据后进行处理,判断测试的结果,并把结果显示出来。
2010.2[4] 王剑.Windows CE下的串口通信的实现[J].单片机
与嵌入式系统应用,2003.
[5] 张冬泉,谭南林,王雪梅Windows CE实用开发
技术[M].北京:电子工业出版社2006:286-290,312-313.
[6] 田东风.WindowsCE应用程序设计[M].北京:机械
4 结论
串口通信称为整机内部通信以及整机与外部计算机通信的重要标准手段,而嵌入式系统又被广泛应用,所以以Windows CE操作系统的嵌入式产品具备串口通信称为一个嵌入式产品必须具备的功能。因此本论文的研究内容具有很大的理论意义以及实际的应用价值。
工业出版社,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.
参考文献
作者简介:韩雪连,南京邮电大学硕士研究生,
[1] 邱小平.Windows CE6.0开发经典[M].北京:电子
工业出版社,2009:163-179.
[2] 李志明.嵌入式系统的设计方法分析[M].上海:上
海交通大学出版社,2003:35-54.
[3] 李现勇.Viusa1C++串口通信技术与工程实践[M].
北京:人民邮电出版社,2002.
主要研究方向为虚拟仪器在通信信息系统中的应用。E-mail: han_xue_lian@126.com
王勇,教授,博士,南京邮电大学大学实验中心主任。主要研究方向为虚拟仪器,测量与控制技术,各类通信网检测,监控与管理。E-mail:wangyong@njupt.edu.cn
79
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务