Windows CE下串行通信的实现_第1页
免费预览已结束,剩余5页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、windows ce下串行通信的实现windows ce是微软公司推出的一种的操作系统、用于系统资源有限的小型设备。它采纳模块化的结构,支持多种外部接口,包括最常用的rs232串行接口。本文就windows ce系统串行接口的编程举行研究,并给出与设备的接口程序。1 windows ce简介windows ce是一种小型的、基于rom的、具有win32子集api的操作系统。它的优势在于小尺寸、win32 api子集和对多平台的支持能力。在windows ce下编程需要注重的是,windows ce设备的资源很少,存储器、都很小,接口也比较少,而且按照实际状况变幻很大。另外,windows ce

2、只支持unicode,这在编程中要分外注重。在windows ce中,除了一些基本的windows通用控件以外,还有一些特地设计的控件,比如commandbar。windows ce体积虽小,但是它的功能并不少,内存管理、文件操作、多线程、网络功能等等它都支持,可以说是麻雀虽小,五脏俱全。2 windows ce下的串行通信串行端口在windows ce下属于流接口设备,它是串行设备接口的常规i/o驱动程序调用和与通信相关的详细函数的结合。串行设备被视为用于打开、关闭、读写串行端口的常规、可安装的流设备。windows ce的通信函数和其它大多数windows的通信函数相同。特殊要注重的是,w

3、indows ce不支持挺直对串行端口的寄存器举行编程。常用的串行端口函数介绍如下:(1)打开和关闭串行端口createfile函数用于打开串行口。hport=createfile(text(“com1:”),generic_read|generic_write,0,null,open_existing,0,null)。注重com1后要有一个冒号。最后一个参数dwflagsandattributes必需为0,由于windows ce只支持非重叠i/o。第3个参数dwsharemode也必需为0,通信端口不能像文件一样被分享。这个函数的返回值是已打开的串行端口的句柄或者是invalid_hand

4、le_value。关闭串行口可以调用closehandle(hport)。(2)配置串行端口配置串行口主要是用dcb结构配置端口设置,包括波特率、停止位、数据位长度、校验位、流量控制等等,还有配置超时值。首先打开串行端口,用getcommstate函数获得当前打开串口配置,然后按照需要修改dcb成员,最后用setcommstate函数设置新的串口配置。dcb portdcb; /创建dcb变量port.dcb.dcblength=sizeof(dcb);getcommstate(hport,%26;amp;portdcb); /猎取当前串口配置修改dcb成员portdcb.baudrate=9

5、600; /波特率portdcb.parity=noparity; /校验位portdcb.stopbits=onestopbit; /停止位portdcb.bytesize=8;.setcommstate(hport,%26;amp;portdcb); /设置新的串口配置对串行端口来说,必需配置超时值,否则程序可能陷入到一个循环来等待来自串口的字符。这对采纳windows ce的设备来说,将大大削减设备电池的用法时光,所以超时值是需要配置的。另外一种解决方法就是采纳多线程。多线程将在下一部分叙述。通常,配置超时值和配置串口类似。首先用getcommtimeouts函数获得当前串口的超时值。然

6、后可以修改commtimeout成员,最后用setcommtimeouts函数设定超时值。commtimeouts commtimeouts; /定义commtimeouts结构getcommtimeouts(hport,%26;amp;commtimeouts); /获得当前的超时值/修改commtimeout成员commtimeouts.readintervaltimeout=maxdword;commtimeouts.readtotaltimeoutmultiplier=0;commtimeouts.readtotaltimeoutconstant=0;commtimeouts.writ

7、etotaltimeoutconstant=1000;commtimeouts.writetotaltimeoutmultiplier=10;setcommtimeouts(hport,%26;amp;commtimeouts); /设定超时值(3)读写串行端口用readfile和writefile函数读写串行口。int rc;dword cbytes;byte ch;rc=readfile(hport,%26;amp;ch,1,%26;amp;cbytes,null);其中第一个参数是串口句柄,第2个参数是读回的字符,第3个参数是要读取的字符数量,第4个参数返回实际读取到的字符数量。int

8、rc;dword cbytes;byte ch=text(“a”);rc=writefile(hport,%26;amp;ch,1,%26;amp;cbytes,null);其中第一个参数是串口句柄,第2个参数是要写入的字符,第3个参数是要写入的字符数量,第4个参数返回字符写入的字符数量。需要注重的是windows ce不支持重叠i/o,所以假如在主线程举行大量读写串口操作时,有可能使囫囵程序陷入缓慢的串口等待中去,因此普通都采纳多线程来举行读写串口操作。(4)通信大事在windows ce编程中,除了可以采纳单独的线程来处理读写串口操作外,还可以采纳利用通信大事的办法。通信大事就是当发生重要

9、大事时,windows ce向应用程序发送的通知。利用waitcommevent函数堵塞线程,直到特定的大事发生。普通的用法办法是:先用setcommevent函数指定要查找的一个或多个大事,然后,调用waitcommevent函数,并指定导致这个函数返回的大事。当waitcommevent函数返回后,循环调用readfile函数,读回全部接收到的字符。最后再次调用setcommevent函数,指定下次要查找的大事。3 windows ce下的多线程windows ce是一个彻低的多任务、多线程的操作系统。windows ce同时最多可以运行32个进程。每个进程有一个主线程,而且可以有多个附加

10、线程。附加线程的多少仅受可用内存和线程堆栈的进程地址空间的限制。windows ce是以抢先方式调度线程的。线程以时光片为单位来运行,通常是25ms。线程拥有优先级,全部高优先级的线程都将在低优先级的线程之前运行。在可以调度被设定为特定优先级的线程之前,全部拥有高优先级的线程都必需被堵塞。同等优先级的线程以循环方式来调度。假如高优先级的线程停止堵塞,而低优先级的线程目前正在运行,则低优先级的线程会立即被挂起,同时去调度高优先级的线程。低优先级的线程永久不会抢占高优先级的线程,固然也有例外:一种是线程具有优先级thread_priority_time_critical,它永久不会被抢占;另一种就

11、是低优先级的线程拥有高优先级的线程正在等待的资源,浮现优先级倒置。在windows ce中,线程可以有8种优先级。下面是一个创建线程和线程函数的例子:handle hthread;dword dwthreadid=0;int nparameter=5;hthread=createthread(null,0,thread,nparameter,0,%26;amp;dwthreadid); /创建线程closehandle(hthread); /关闭线程/线程函数dword winapi thread (pvoid parg)int nparam=(int)parg;.return 0x15;cr

12、eatethread函数在许多参数在windows ce下都不支持,所以被设为null或0。第3个参数指向线程函数的开头,第4个参数是createthread函数传到线程函数的唯一参数。createthread函数返回线程句柄,当这个句柄不需要时,调用closehandle函数关闭它。线程函数在被终止之前向来运行,调用exitthread函数可终止线程的执行。对于在系统中运行的多个线程,需要协调它们的活动,也就是实现同步。在windows ce中,采纳的办法是用法同步对象。一个线程等待一个同步对象,当用信号通知该对象时,解除堵塞正在等待的线程并调度该线程。同步对象包括大事和互斥体。在这里我们只

13、介绍大事。大事对象就是一种有两种状态有信号和元信号的同步对象。大事被创建后自动被置为信号状态。大事可以被命名,从而被不同进程分享。采纳下面的函数创建大事:handle createevent(lpsecurity_attributes lpeventattributes,bool bmanualreset,bool binitialstate,lptstr lpname);函数的第1个参数应为0,第2个参数表示大事成为有信号后应当人工重置或自动重置为无信号状态,第3个参数表示创建时大事是有信号还是无信号状态,最后一个参数指向大事名。被命名的大事可以被进程分享,否则就设为null。创建大事后,就

14、可以采纳setevent函数或者是pulseevent函数用信号通知该大事。setevent函数是自动重置大事,只释放一个线程来运行;pulseevent函数是人工重置大事,释放全部等待那个大事的线程。最后可以用closehandle函数破坏大事对象。大事的使用通常是,线程用法了下列函数中的一个来等待大事:waitforsingleobject、waitformultipleobjects、msgwaitformultipleobjects或msgwaitformultipleobjectsex。当线程被这些函数的其中一个堵塞时,线程只消耗少量的电能和cpu处理能力。需要注重的是:应用程序的主线程不能被waitforsingleobject或waitformultipleobjects堵塞,否则主线程无法处理消息循环。通常的做法是采纳多线程,主线程处理消息循环,附加线程处理需要在大事上堵塞的分享资源。4 实际应用在车载定位系统中,导般计算机需要接受多种的数据输入,其中最常用到的就是gps数据。通常g

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论