软件开发的家园,编程爱好者的天地.

现在是:北京时间 2016/4/14 上午11:50:51 星期四

设为首页  |  加入收藏  |  网站地图

当前位置: 第八基地首页 > 移动开发 >
WinXP与WinCE串口的运行机制之比较
发布于:第八基地 来源:互联网 作者:天堂路上 时间:2016-04-26 点击:291
//========================================================================
//TITLE:
// WinXP与WinCE串口的运行机制之比较
//AUTHOR:
// norains
//DATE:
// Saturday 11-November-2006
//PassedEnvironment:
// PC:WinXP VC6.0
// CE:WinCE4.2 EVC4.0
//========================================================================
查看微软相关的串口通信文档,可以发现在桌面操作系统中,串口通信分为两种模式:同步和异步.而WinCE只有一种,但文档中却没标明归属哪种模式.实际上,WinCE的串口通信模式更像介于同步和异步之间.
在此先简要地介绍何为同步和异步.所谓的同步,指得是对同一个设备或文件(在文中只的是串口COM1)的读或写操作必须要等待上一个操作完成才能进行.比如说,调用ReadFile()函数读取串口,但由于上一个WriteFile()操作没完成,ReadFile()的操作就被阻塞,直到WriteFile()完成后才能运行.而异步,则无论上一个操作是否完成,都会执行目前调用的操作.还是拿前面举的例子,在异步模式下,即使WriteFile()没有执行完成,ReadFile()也会立刻执行.


1.CreateFile()参数的差异
首先说明一下WinCE和WinXP打开串口时参数的差异.以打开串口COM1为例子,WinCE下的名字为"COM1:",而WinXP为"COM1",两者的唯一区别仅仅在于WinCE下多个分号.
例如:
HANDLEhd=CreateFile(TEXT("COM1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);//WinCE
HANDLEhd=CreateFile(TEXT("COM1"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);//WinXP
在这稍微多说一下,在默认的环境下,TEXT宏在WinCE下会编译为双字节,而WinXP为单字节.换句话说,TEXT("COM1")在WinCE下相当于L"COM1",而WinXP则为"COM1".


2.单线程比较
还是用代码做例子来说明比较形象.这是一段单线程的代码,先对串口进行写操作,然后再读.对于WinXP来说,这是同步模式.(与主题无关的代码省略) 
intWINAPIWinMain( HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
... 
HANDLEhCom=CreateFile(TEXT("COM1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);//WinCE
//HANDLECom=CreateFile(TEXT("COM1"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);//WinXP

...
DWORDdwBytes;
if(WriteFile(hCom,TEXT("COM1:"),5,&dwBytes,NULL)==FALSE)//WinCE
//if(WriteFile(hCom,TEXT("COM1"),5,&dwBytes,NULL)==FALSE)//WinXP
{
return0x05;
}

...
DWORDdwRead;
charszBuf[MAX_READ_BUFFER];
if(ReadFile(hCom,szBuf,MAX_READ_BUFFER,&dwRead,NULL)==FALSE)
{
return0x10;
}

...
}
经过实验,可以发现这段代码在WinCE和WinXP下都能正常工作,并且其表现也相同,都是在WriteFile()函数返回后才执行ReadFile().
由于异步模式在单线程中也能正常运作,唯一的不同只是在执行WriteFile()时可能也会执行ReadFile()(依WriteFile()函数执行的时间而定),所在此不表.

3.多线程比较
单线程两者表现相同,那多线程呢?下面这段代码采用多线程,先是创建一个读的线程,用来监控串口是否有新数据到达,然后在主线程中对串口写出数据.
对我有帮助
(0)
0%
对我没帮助
(0)
0%
返回顶部
在线反馈
在线反馈