异步串口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 )
分享到:
相关推荐
在Windows CE(简称WinCE)操作系统中...熟练掌握这些函数及其使用方法,是进行WinCE串口编程的基础。通过文档中的"WinCE串口API函数.doc",开发者可以更深入地学习每个函数的详细用法和示例,进一步提升串口编程能力。
在WinCE系统中,串口通信主要依赖于系统提供的SerialPort类或API函数。 1. **串口初始化**: 在WinCE中,首先需要打开串口,这通常通过调用CreateFile API完成。函数参数包括串口设备名(如"COM1:"),访问模式...
1. **WinCE串口API**:WinCE提供了类似于Windows API的串口操作函数,如CreateFile、SetCommState、SetCommMask、ReadFile、WriteFile等,用于打开、配置、读写串口。 2. **DCB结构体**:Device Control Block,用于...
《WINCE串口读写小精灵 MFC/API版》是一款专为Windows CE系统设计的串口通信工具,它集成了MFC(Microsoft Foundation Classes)框架和API(Application Programming Interface)编程方式,使得开发者在WINCE5、...
在Wince下,串口通信可以通过Windows CE的Win32 API实现,比如`CreateFile`、`SetCommState`、`WriteFile`和`ReadFile`等函数。本实例可能包含了设置波特率、校验位、停止位、数据位等参数,以及发送和接收数据的...
在"串口编程示例(eWin助手源码)"这个压缩包中,包含了实际的源码示例,它演示了上述步骤的实现。通过学习这些源码,你可以理解如何在VS2008环境下构建一个完整的串口通信程序。这将帮助你在实际项目中实现类似功能...
在WinCE串口通信的实践中,我们将使用面向对象的编程方法。创建一个名为`CPort`的类来封装串口操作,包括打开、关闭串口、发送和接收数据。以下是一些关键成员函数: - **CPort()** 和 **~CPort()**:构造和析构...
本资源提供的是“wince串口通讯”源码,下面将详细介绍串口通信的基本概念、在WinCE中的实现以及相关编程知识。 串口通信,也称为串行通信,是指数据以串行方式一位一位地传输。在计算机硬件中,串口通常指的是COM...
”这表明该压缩包包含了一套已经封装好的串口通信类,可以简化EVC中的串口编程工作。封装类通常会隐藏底层的复杂细节,提供简洁的API,使开发者能够更专注于应用逻辑。 串口通信在WinCE中主要依赖于系统提供的...
这些API函数是Windows CE串口通信的核心,用于打开串口、设置波特率、数据位、停止位、校验位等参数,以及读写数据。 例如,`CreateFile`函数用于打开一个串口设备,返回一个文件句柄,后续的通信操作都将基于这个...
线程的实现通常依赖于Windows API中的`SetCommMask()`和`WaitCommEvent()`函数,前者用于设置要监听的事件,后者则等待这些事件的发生。 在实际编程中,开发者还需要考虑串口参数的配置,如波特率、数据位、停止位...
在Windows CE(简称WinCE)操作系统中,串口通信是一个重要的功能,对于开发嵌入式..."Wince_Serial.zip"这个资源包为开发者提供了实践和学习WinCE串口编程的实用工具和资料,对深入理解和应用WinCE串口技术大有裨益。
2. **WinCE API**:开发者需要直接调用Windows CE的API函数,如`CreateFile`来打开串口,`SetCommState`来设置串口参数,`WriteFile`和`ReadFile`进行数据传输,以及`CloseHandle`关闭串口。 3. **同步与异步通信**...
本文将深入探讨wince在ARM9平台上如何进行串口编程,帮助你掌握这个关键技能。 串口在wince中的实现主要是通过Windows CE的API函数来完成的。这些API函数提供了打开、关闭、读取、写入以及配置串口参数等基本操作。...
4. **串口编程**:压缩包中的“UART”可能是源代码文件或者一个已编译的库,包含了实现串口通信的函数和API。常见的操作包括打开串口、设置波特率、读写数据、关闭串口等。了解这些API的使用方法对于进行WinCE设备的...
这份源代码不仅提供了一个实际运行的示例,也是学习和研究WinCE串口编程的一个良好起点。通过深入研究和理解这份源代码,开发者可以更好地应对各种串口通信场景,提升其在WinCE平台上的开发能力。