| 网站首页 | 科技前沿 | it产品项目 | 软件项目 | 硬件项目 | 发明专利 | 商业城 | 资源中心 | 博客 | 论坛 |  子站: it客栈 多奥网
会员中心
会员注册
繁體中文
推荐:索引 linux arm 手机 嵌入式 os wince dsp 音乐 游戏
 站内搜索:
项目资讯 资源中心
您现在的位置: 爱问科技网 >> 软件项目 >> WinCE >> 文章正文
Windows CE下串行通信的实现           
Windows CE下串行通信的实现
作者:佚名 文章来源:不详 更新时间:2006-12-6 22:44:17

 

摘要:Windows CE是微软公司推出的一种嵌入式的操作系统、用于系统资源有限的小型设备。它采用模块化的结构,支持多种外部接口,包括最常用的RS232串行接口。本文就Windows CE系统串行接口的编程进行讨论,并给出与GPS设备的接口程序。

    关键词:Windows CE 串行通信 GPS

1 Windows CE简介

Windows CE是一种小型的、基于ROM的、具有Win32子集API的操作系统。它的优势在于小尺寸、Win32 API子集和对多平台的支持能力。在Windows CE下编程需要注意的是,Windows CE设备的资源很少,存储器、显示器都很小,接口也比较少,而且根据实际情况变化很大。另外,Windows CE只支持Unicode,这在编程中要格外注意。在Windows CE中,除了一些基本的Windows通用控件以外,还有一些专门设计的控件,比如CommandBar。Windows CE体积虽小,但是它的功能并不少,内存管理、文件操作、多线程、网络功能等等它都支持,可以说是麻雀虽小,五脏俱全。

2 Windows CE下的串行通信

串行端口在Windows CE下属于流接口设备,它是串行设备接口的常规I/O驱动程序调用和与通信相关的具体函数的结合。串行设备被视为用于打开、关闭、读写串行端口的常规、可安装的流设备。Windows CE的通信函数和其它大多数Windows的通信函数相同。特别要注意的是,Windows 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_HANDLE_VALUE。

关闭串行口可以调用CloseHandle(hPort)。

(2)配置串行端口

配置串行口主要是用DCB结构配置端口设置,包括波特率、停止位、数据位长度、校验位、流量控制等等,还有配置超时值。

首先打开串行端口,用GetCommState函数获得当前打开串口配置,然后根据需要修改DCB成员,最后用SetCommState函数设置新的串口配置。

DCB PortDCB; //创建DCB变量

Port.DCB.DCBlength=sizeof(DCB);

GetCommState(hPort,&PortDCB); //获取当前串口配置修改DCB成员

PortDCB.BaudRate=9600; //波特率

PortDCB.Parity=NOPARITY; //校验位

PortDCB.StopBits=ONESTOPBIT; //停止位

PortDCB.ByteSize=8;

.

.

.

SetCommState(hPort,&PortDCB); //设置新的串口配置

对串行端口来说,必须配置超时值,否则程序可能陷入到一个循环来等待来自串口的字符。这对采用Windows CE的设备来说,将大大减少设备电池的使用时间,所以超时值是需要配置的。另外一种解决办法就是采用多线程。多线程将在下一部分讲述。

通常,配置超时值和配置串口类似。首先用GetCommTimeouts函数获得当前串口的超时值。然后可以修改COMMTIMEOUT成员,最后用SetCommTimeouts函数设定超时值。

COMMTIMEOUTS CommTimeouts; //定义COMMTIMEOUTS结构

GetCommTimeouts(hPort,&CommTimeouts); //获得当前的超时值

//修改COMMTIMEOUT成员

CommTimeouts.ReadIntervalTimeout=MAXDWORD;

CommTimeouts.ReadTotalTimeoutMultiplier=0;

CommTimeouts.ReadTotalTimeoutConstant=0;

CommTimeouts.WriteTotalTimeoutConstant=1000;

CommTimeouts.WriteTotalTimeoutMultiplier=10;

SetCommTimeouts(hPort,&CommTimeouts); //设定超时值

(3)读写串行端口

用ReadFile和WriteFile函数读写串行口。

int rc;

DWORD cBytes;

BYTE ch;

Rc=ReadFile(hPort,&ch,1,&cBytes,NULL);

其中第一个参数是串口句柄,第2个参数是读回的字符,第3个参数是要读取的字符数量,第4个参数返回实际读取到的字符数量。

Int rc;

DWORD cBytes;

BYTE ch=TEXT(“a”);

Rc=WriteFile(hPort,&ch,1,&cBytes,NULL);

其中第一个参数是串口句柄,第2个参数是要写入的字符,第3个参数是要写入的字符数量,第4个参数返回字符写入的字符数量。

需要注意的是Windows CE不支持重叠I/O,所以如果在主线程进行大量读写串口操作时,有可能使整个程序陷入缓慢的串口等待中去,因此一般都采用多线程来进行读写串口操作。

(4)通信事件

在Windows CE编程中,除了可以采用单独的线程来处理读写串口操作外,还可以采用利用通信事件的方法。通信事件就是当发生重要事件时,Windows CE向应用程序发送的通知。利用WaitCommEvent函数阻塞线程,直到特定的事件发生。一般的使用方法是:先用SetCommEvent函数指定要查找的一个或多个事件,然后,调用WaitCommEvent函数,并指定导致这个函数返回的事件。当WaitCommEvent函数返回后,循环调用ReadFile函数,读回所有接收到的字符。最后再次调用SetCommEvent函数,指定下次要查找的事件。

3 Windows CE下的多线程

Windows CE是一个完全的多任务、多线程的操作系统。Windows CE同时最多可以运行32个进程。每个进程有一个主线程,而且可以有多个附加线程。附加线程的多少仅受可用内存和线程堆栈的进程地址空间的限制。

Windows CE是以抢先方式调度线程的。线程以时间片为单位来运行,通常是25ms。线程拥有优先级,所有高优先级的线程都将在低优先级的线程之前运行。在可以调度被设定为特定优先级的线程之前,所有拥有高优先级的线程都必须被阻塞。同等优先级的线程以循环方式来调度。如果高优先级的线程停止阻塞,而低优先级的线程目前正在运行,则低优先级的线程会立刻被挂起,同时去调度高优先级的线程。低优先级的线程永远不会抢占高优先级的线程,当然也有例外:一种是线程具有优先级THREAD_PRIORITY_TIME_CRITICAL,它永远不会被抢占;另一种就是低优先级的线程拥有高优先级的线程正在等待的资源,出现优先级倒置。在Windows CE中,线程可以有8种优先级。

下面是一个创建线程和线程函数的例子:

HANDLE hThread;

DWORD dwThreadID=0;

Int nParameter=5;

HThread=CreateThread(NULL,0,Thread,nParameter,0,&dwThreadID); //创建线程

CloseHandle(hThread); //关闭线程

//线程函数

DWORD WINAPI Thread (PVOID pArg)

{

int nParam=(int)pArg;

.

.

.

return 0x15;

}

[1] [2] 下一页

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    相关文章
    EJB 最佳实践:工业强度…
    关于在 win2000 下安装 …
    获取Windows / System /…
    print+Photoshop超简易上…
    ASP中使用Form和QuerySt…
    献给linux下的perl黑客们…
    Java中finalize()的另类…
    Merlin 的魔力:不确定的…
    Resin虚拟主机设置篇之I…
    [JAVA100例]076、在Appl…
    更多内容
    专题栏目
    更多内容
    最新推荐 更多内容
    | 设为首页 | 加入收藏 | 关于我们 | 版权申明 | 友情链接 | 谷歌 雅虎 百度 | 管理登录 | 

    爱问科技网
    爱问科技网

    21aw@21aw.com
    粤icp备06099319