轉自:http://space.baidu.com/lewutian/blog/item/83afc03d445ae7e53c6d974b.html
控件的设计与实现
控件的设计一般的掌上电脑只配备了串口1,而串口2则需要外接适配卡。本文主要是针对长白公司生产的蓝天LT-90-1机型提供辅助的功能,所以本控件默认使用串口1。由于掌上电脑的资源比较少,为了尽量减少CPU的占用,本控件采用了每一定时间间隔对串口进行采样的方案,对串口的每一次读写采取了限时的方法,保证控件可以在较短的时间结束调用,用牺牲一定的成功率来实现调用的效率,避免无限时的对串口操作的等待而引起的待机。控件的设计包括:
控件目的:提供对串口通信的打开、关闭和读写的控制。
控件设计的主要部分是与使用者之间交互的过程,即控件提供给使用者的函数和通过事件来通知使用者做出相应的处理。下面是本控件所实现的事件和方法。
控件触发的事件:在串口通信的过程中,控件通过如下的两个事件来通知使用者做出处理。
NewData:当此事件被触发时,表示在串口收到新的数据,此时程序应对该事件做出反应,及时收取数据。
WriteError:当此事件被触发时,表示对串口的写操作失败了,此时程序应对错误进行处理。
控件实现的方法:控件提供了四个方法供使用者调用,使用者在得到控件指针后,通过这四个函数来完成对串口的打开、关闭和读写。Open:无参数。在第一次使用时,应调用此函数,对串口进行初始化。默认串口的参数为9600波特率、8位字符、一位校正位、奇偶校验。当初始化成功时返回TRUE,失败时返回FALSE。Read:参数ReadBuffer和ReadSize,ReadBuffer是一个读入字符缓冲区。在NewData事件的响应函数内部,使用Read来读取从串口输入的字符。成功时函数返回TRUE,ReadSize返回读出的字节个数,ReadBuffer返回读出的字符;失败时,函数返回FALSE。Write:参数WtiteBuffer和WriteSize,WriteBuffer是想要写入串口的字符。此函数可在任何时候调用。如果函数返回FALSE,则表示输入的参数有错误;如果函数返回TRUE,则表示输入参数正确。如果在传输的过程中出现了错误,则控件将引发WriteError事件,通知应用程序写操作失败,并由应用程序做出相应的处理。Close:无参数。在串口使用结束后,请调用此函数,它将释放由控件打开的串口资源,以便其他的程序继续使用该资源。
基本的串行通信编程 串行设备被视为用于打开、关闭、读和写串口的常规、可安装的流设备。Win32 API提供了一组通信函数,Windows CE支持了其中的大多数通信函数。
打开和关闭串行端口:在所有的流设备都可以使用CreateFile来打开串行端口设备。一般的调用方法如下:
hSer=CreateFile(TEXT(“COM1:”),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
由于Windows CE不支持设备的重叠I/O,因此不能传递FILE_FLAG_OVERLAPPED标志。当不成功时,返回句柄INVALILD_HANDLE_VALUE,反之返回打开的串行端口句柄。
调用CloseHandle可以关闭一个串行端口:
CloseHandle(hSer);
读写串行端口:可以使用ReadFile和WriteFile来读写串行端口。从串口读出数据只需如下调用:
int rc;
DWORD cBytes;
BYTE ch;
rc=ReadFile(hSer,&ch,1,&cBytes,NULL);
调用成功,则变量ch将读入一个字节,cBytes将被设置为读取的字节的数量。
从串口写入数据只需如下调用:
int rc;
DWORD cBytes;
BYTE ch;
ch=TEXT(‘A’);
rc=WriteFile(hSer , &ch , 1 , &cBytes , NULL );
上面的代码将字母A写入已经打开的端口,成功的话,ReadFile和WriteFile都将返回TRUE。
控件的调试 由于本控件的开发平台的特点,使得程序的调试有所不同。在程序编译后,Visual C++使用同步服务器将程序传输到掌上电脑中,此时,掌上电脑与主机之间使用了串口1,如果不关闭同步服务器的话,那么在掌上电脑使用控件对串口1进行初始化时,将会失败。因此,必须在程序传输到掌上电脑后,将与主机的连接关闭,同时要在主机上关闭同步服务器,否则服务器将不停地向掌上电脑发送同步信号。由于关闭了串口,则无法使用Visual C++提供的调试功能,只有在程序中自己输出调试信息,并改正程序。基本的调试手段是在程序需要查看变量的地方,用AfxMessageBox函数将变量的内容输出,或者在程序的对话框中添加一个文本编辑控件,来输出程序的信息。
控件的台式机版的实现 在实现了一个WindowsCE的控件后,开发者将会面临一个问题,当你想在你的应用程序中使用该控件的时候,你在台式机的注册表中找不到你设计的控件,因而也无法在VisualC++中或Visual Basic中使用。这是因为CE版的Active X控件被注册在相应的WindowsCE的设备的注册表中,而没有在台式机上注册。
为了解决这个问题,你必须实现两个版本的CE控件。版本1注册在你的WindowsCE的设备上,版本2注册在你开发应用程序的台式机的注册表中。第二版本的控件实现了在WindowsCE上控件的外壳,即提供了控件的所有方法和事件,但没有具体的函数的实现。它仅用来提供应用程序到控件的所有连接。
3.结束语
本文讨论了基于Windows CE平台的COM应用开发,提出了一个串口通信控件的实现以作为示例。该控件可以嵌入到大部分的Windows CE的程序中,很好地完成现串口通信的基本任务。
目前,COM还处在不断发展的阶段中,新的技术不断出现。分布式组件对象模型(简称为DCOM)把COM的位置透明特性扩展到不同的计算机上。COM+则扩展了中间组件,以便其支持成百上千的同时访问。COM+组件服务为组件开发者经常需要的服务提供了标准的服务实现,从而解放了开发者,使之能够把精力集中在商务处理问题上。而微软的Windows DNA(Windows Distributed Internet ApplicationArchitecture),是Windows平台应用程序基于COM开发的又一模式,它使得客户机和服务器方的开发更加专一和简化。这些新的技术,必然会给Windows CE平台的应用开发带来更大的活力。相信Windows CE的明天会更加灿烂 。