当前位置:首页 > 编程开发

WinCE串口编程API函数(二)

webgou16年前 (2010-09-08)编程开发478

异步串口I/O:

BOOL GetCommMask(

HANDLE hFile,

LPDWORD lpEvtMask

);

BOOL SetCommMask(

HANDLE hFile,

DWORD dwEvtMask

);

BOOL WaitCommEvent(

HANDLE hFile,

LPDWORD lpEvtMask,

LPOVERLAPPED lpOverlapped

);

GetCommMask函数用于得到串口已经设置了的串口事件,参数hFile指定已打开的串口句柄,参数lpEvtMask用于存取得到的串口事件 集。SetCommMask函数的功能与GetCommMask函数正好相反,用于设置串口事件集。WaitCommEvent函数用于等待预先设置的串 口事件中的某一个事件发生,该函数将阻塞线程,直到预先设置的串口事件中的某一事件的发生。参数lpEvtMask用于存储已经发生的事件,参数 lpOverlapped必须设置为NULL,因为在Windows CE中不支持重叠I/O操作。

串口时间表: EV_BREAK 检测到中断发生 EV_CTS CTS信号改变了状态 EV_DSR DSR信号改变了状态 EV_ERR 串口驱动程序检测到了错误,如CE_RXPARITY,CE_OVERRUN,CE_FRAME EV_RING 检测到振铃 EV_RLSD RLSD信号改变了状态 EV_RXCHAR 接收到了一个字符 EV_RXFLAG 接收到了一个事件字符 EV_TXEMPTY 在输出缓冲区中的最后一个字符被发送 .设置端口读写超时:

BOOL GetCommTimeouts(

HANDLE hFile,

LPCOMMTIMEOUTS lpCommTimeouts

);

BOOL SetCommTimeouts(

HANDLE hFile,

LPCOMMTIMEOUTS lpCommTimeouts

);

在用ReadFile和WriteFile读写串口时,需要考虑超时问题。如果在指定的时间内没有读出或者写入指定数量的字节数据,那么 ReadFile函数或者WriteFile函数就会返回。GetCommTimeouts函数用来查询当前的超时时间设置,该函数会填充一个 COMMTIMEOUTS结构。SetCommTimeouts函数用来通过一个COMMTIMEOUTS结构设置超时时间。两个函数的返回值都是成功时 返回非零值,失败时返回零。

typedefstruct _COMMTIMEOUTS {

DWORD ReadIntervalTimeout; /*读间隔超时*/

DWORD ReadTotalTimeoutMultiplier; /*读时间系数*/

DWORD ReadTotalTimeoutConstant; /*读时间常量*/

DWORD WriteTotalTimeoutMultiplier; /*写时间系数*/

DWORD WriteTotalTimeoutConstant; /*写时间常量*/

} COMMTIMEOUTS,*LPCOMMTIMEOUTS;

ReadIntervalTimeout:以毫秒为单位设置通信线路上的两个字符到达之间最大时间间隔。在ReadFile操作期间,从接收到第一个 字符开始计时。如果任意两个字符到达之间的时间间隔超过这个最大值,则ReadFile操作完成,返回缓冲数据。如果该值设置为0,则不使用间隔超时。

ReadTotalTimeoutMultiplier:读时间系数。以毫秒为单位设置一个用来计算读操作总超时时间的时间系数。

ReadTotalTimeoutConstant:读时间常量。以毫秒为单位设置一个用来计算读操作总超时时间的时间常量。

读总超时时间 = 读时间系数*要读的字节数 + 读时间常量

WriteTotalTimeoutMultiplier:写时间系数。以毫秒为单位设置一个用来计算写操作总超时时间的时间系数。

WriteTotalTimeoutConstant:写时间常量。以毫秒为单位设置一个用来计算写操作总超时时间的时间常量。

写总超时时间 = 写时间系数*要写的字节数 + 写时间常量

超时有间隔超时和总超时两种类型。间隔超时是指在接收时两个字符之间的最大时延。从串口读取数据时,当接收到一个字节时,通信驱动程序启动一个内部定 时器开始计时,在下一个字节到来之前,如果定时器时间超过了间隔超时时间,读操作就会被放弃。总超时是指读操作或者写操作总共花费的最大时间。写操作只支 持总超时,读操作对两种类型的超时都支持。

如果应用程序将ReadIntervalTimeout和ReadTotalTimeoutMultiplier设置为MAXDWORD,并且将 ReadTotalTimeoutConstant设置为大于0并且小于MAXDWORD的数,则调用ReadFile函数时,会有以下情况:

1 如果接收缓冲区中有字符存在,则ReadFile函数立即返回这些字符。

2 如果接收缓冲区中没有字符,则ReadFile函数会等待直到一个字符到达,然后立即返回。

3 若在ReadTotalTimeoutConstant设定的时间内没有任何字符到达,则ReadFile超时返回。

间隔超时和总超时的设置是不相关的。

下面列举一些情况:

1 有读间隔超时,读总超时,写总超时:将COMMTIMEOUTS结构中的五个成员设置为相应值。

2 有读总超时,写总超时:将ReadIntervalTimeout设置为0,将其他成员设置为相应值。

3 在读一次输入缓冲区中的内容后,读操作就立即完成,不管是否读入了要求的字符:将ReadIntervalTimeout设置为MAXDWORD,

将ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都设置为0。

4 ReadFile没有超时设置,直到有适当的字符数返回或者错误发生,该函数才返回:将ReadIntervalTimeout,ReadTotalTimeoutMultiplier和

ReadTotalTimeoutConstant都设置为0。

5 WriteFile没有超时设置:将WriteTotalTimeoutMultiplier和

WriteTotalTimeoutConstant都设置为0。

例:

----------------------------------

COMMTIMEOUTS CommTimeOuts;

GetCommTimeouts(m_hComm, &CommTimeOuts);

CommTimeOuts.ReadIntervalTimeout = 100;/* 接收字符间最大时间间隔 */

CommTimeOuts.ReadTotalTimeoutMultiplier = 1;

CommTimeOuts.ReadTotalTimeoutConstant = 100;/* 读数据总超时常量 */
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;

CommTimeOuts.WriteTotalTimeoutConstant = 0;

SetCommTimeouts(m_hComm, &CommTimeOuts);

----------------------------------

----------------------------------

COMMTIMEOUTS CommTimeOuts;

GetCommTimeouts (m_hComm, &CommTimeOuts);

CommTimeOuts.ReadIntervalTimeout = MAXDWORD;

CommTimeOuts.ReadTotalTimeoutMultiplier = 0;

CommTimeOuts.ReadTotalTimeoutConstant = 0;

CommTimeOuts.WriteTotalTimeoutMultiplier = 10;

CommTimeOuts.WriteTotalTimeoutConstant = 1000;

SetCommTimeouts( m_hComm, &CommTimeOuts )

 

来源:http://hi.baidu.com/feng411215/blog/item/dac18fce537c1b0e92457ea8.html

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=323

标签: wince
分享给朋友:

“WinCE串口编程API函数(二)” 的相关文章

ATL处理函数跳转的思考

今天,分析MFC与WTL的消息映射,比较难理解的有下面两点: 1.MFC,AfxCbtFilterHook转到AfxWndProc, 2.WTL(ATL),CWndProcThunk把窗口指针跳转到WindowProc,并把hWnd改成窗口指针.…

数据挖掘算法(Analysis Services – 数据挖掘)

“数据挖掘算法”是创建数据挖掘模型的机制。…

宽带ADSL中的VPI/VCI是什么?

宽带ADSL中的VPI/VC …

iOS-NSLog对程序性能的影响以及Delegate使用问题

首先是介绍NSLog对程序性能的影响:NSLog,既可以像printf那样方便地格式化输出,同时还能输出时间以及进程ID等信息,可谓调试利器.但是其实NSLog对程序性能也有不小的影响,在执行次数比较少的情况下可能看不出来什么,当短时间大量执行的时候就会对程序执行效率产生可观的影响.我遇到的一种情况…

增加标题栏按钮

增加标题栏按钮: 1.创建GUID,用GUDI工具创建. 2.增加一个键值,键名为刚创建好的GUID HKEY_LOCAL_MACHINE/Software/Microsoft/Internet Explorer/Extensions/{GUID} 3.增加图标,名称 ButtonText - 按钮…

singleton模式

singleton模式 #include "stdio.h" class singleton { private static singleton instance = new singleton();//不能在这里初始化 singleton(){} ~singleton(){} publi…

评论列表

webgou
webgou

win32 api 在msdn的platform sdk部分

webgou
webgou

Iphone 越狱:绕过app store,使用第三方软件
Iphone 解锁:用软件解锁方式,可以在非签约国家使用电话短信功能,在中国可以用GSM,WCDMA
Iphone 破解:混淆概念了,不谈....

webgou
webgou

near far
:PC机得存储器地址是由段地址和偏移地址组合而成,每一段不能超过64k字节地址,因而统一个段内的地址存取,用偏移地址就可以实现,因段地址寄存器所存的段地址是不变。当用指针时,只16未就够了,这一类就是near指针。当要在另一个段内取数据,就要跨越段,既要指明存取段的段地址和偏移地址,这时段地址寄存器所存段地址要改变,在使用指针指向另一个段内地址时,就要用32位表示,就是far指针了。

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。