Windows串口编程技术_第1页
Windows串口编程技术_第2页
Windows串口编程技术_第3页
Windows串口编程技术_第4页
Windows串口编程技术_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、 Windows串口编程技术 本讲重点提要 本讲对本讲对WindowsWindows串口编程中涉及到的串口编程中涉及到的APIAPI函数和系函数和系 统结构进行了较为详细的介绍,内容包括串口编程统结构进行了较为详细的介绍,内容包括串口编程 相关结构和相关结构和APIAPI函数的介绍,以及串口通信超时处函数的介绍,以及串口通信超时处 理等技术的介绍。并结合之前学习的理等技术的介绍。并结合之前学习的WindowsWindows异步异步 设备设备I/OI/O技术等介绍一个串口通信类的实现。技术等介绍一个串口通信类的实现。 串口相关结构详解 Windows SDKWindows SDK为串口设备提供了

2、以下几种相关的数据为串口设备提供了以下几种相关的数据 结构。结构。 1.1.设备属性结构。指示串口设备性能,该结构只允许应用程设备属性结构。指示串口设备性能,该结构只允许应用程 序获取,而不可以设置。设备属性结构的内容由串口设备序获取,而不可以设置。设备属性结构的内容由串口设备 驱动决定。结构名称:驱动决定。结构名称:COMMPROPCOMMPROP。 2.2.设备控制块:设备控制块:Device Control BlockDevice Control Block,DCBDCB 3.3.设备配置结构。用于控制设备的可配置属性,该结构允许设备配置结构。用于控制设备的可配置属性,该结构允许 设置和

3、获取。结构名称:设置和获取。结构名称:COMMCONFIGCOMMCONFIG。该结构中也包含了。该结构中也包含了 DCBDCB结构。结构。 4.4.设备操作相关结构,结构名称:设备操作相关结构,结构名称:COMMTIMEOUTSCOMMTIMEOUTS,用于设置,用于设置 串口操作的各种超时。该结构可以配置和获取。串口操作的各种超时。该结构可以配置和获取。 5.5.设备状态结构,用于获取串口运行状态。结构名称:设备状态结构,用于获取串口运行状态。结构名称: COMMSTATCOMMSTAT。 串口相关结构详解 对于串口相关结构的详细介绍,请参阅对于串口相关结构的详细介绍,请参阅MSDNMSD

4、N文档,这文档,这 里我们仅对几个结构的关键域进行说明。里我们仅对几个结构的关键域进行说明。 串口设备通信中最重要的系统结构就是串口设备通信中最重要的系统结构就是DCBDCB(Device Device Control BlockControl Block,设备控制块)。用户需要根据硬件,设备控制块)。用户需要根据硬件 设备厂商提供的硬件数据信息来填充此结构,该结构设备厂商提供的硬件数据信息来填充此结构,该结构 中以下几个域一般需要填充,其它域参考硬件设备说中以下几个域一般需要填充,其它域参考硬件设备说 明书:明书: typedef struct _DCB typedef struct _DC

5、B DWORD DCBlength; DWORD DCBlength; / / 结构长度结构长度: 36: 36字节字节 DWORD BaudRate;DWORD BaudRate;/ / 波特率波特率 BYTE ByteSize; BYTE ByteSize; / / 数据位长度数据位长度 BYTE StopBits; BYTE StopBits; / / 停止位位数停止位位数 DCB; DCB; 串口相关结构详解 COMMCONFIGCOMMCONFIG结构:该结构对于不同厂商的设备可能结构:该结构对于不同厂商的设备可能 会有所不同,根据设备说明书,如果需要对其进行填会有所不同,根据设备说

6、明书,如果需要对其进行填 充,好的做法是首先调用充,好的做法是首先调用GetCommConfigGetCommConfig函数获取当函数获取当 前的前的COMMCONFIGCOMMCONFIG结构,然后调用结构,然后调用SetCommConfigSetCommConfig函数函数 对关心的域进行填充。相关的函数还有对关心的域进行填充。相关的函数还有 GetDefaultCommConfigGetDefaultCommConfig和和SetDefaultCommConfigSetDefaultCommConfig, 以及以及CommConfigDialogCommConfigDialog函数。函

7、数。 关于结构关于结构COMMTIMEOUTSCOMMTIMEOUTS,我们将在后面的,我们将在后面的Time-Time- OutsOuts一节介绍。一节介绍。 串口相关函数详解 串口操作除了使用串口操作除了使用CreateFile, ReadFile, CreateFile, ReadFile, WriteFileWriteFile等等IOIO操作使用的函数之外,操作使用的函数之外,Windows Windows SDKSDK还提供了一套专门用于设备通信的函数,还提供了一套专门用于设备通信的函数, 这些函数可以用于串口通信,也根据设备的类这些函数可以用于串口通信,也根据设备的类 型,也可以用

8、于一些其它设备使用。这里我们型,也可以用于一些其它设备使用。这里我们 仅介绍可以用于串口设备通信的函数。我们可仅介绍可以用于串口设备通信的函数。我们可 以将其分为几类:以将其分为几类: 操作类操作类 属性类属性类 配置类配置类 辅助类辅助类 串口相关函数详解 操作类操作类 对串口的操作除了通常的对串口的操作除了通常的CreateFile, ReadFile, WriteFileCreateFile, ReadFile, WriteFile等等 函数之外,函数之外,Win32Win32还提供了以下函数:还提供了以下函数: BOOL TransmitCommChar (BOOL TransmitC

9、ommChar (HANDLE HANDLE hFile,hFile,/ / 设备句柄设备句柄 char cCharchar cChar/ / 传送的字符传送的字符 ); ); 该函数向指定的串口设备传送一个特定的字符,该字符会在任该函数向指定的串口设备传送一个特定的字符,该字符会在任 何尚未被传送的数据之前传送。这个函数并非专为串口设备提何尚未被传送的数据之前传送。这个函数并非专为串口设备提 供,比如你可以调用该函数向控制台传送一个中断符供,比如你可以调用该函数向控制台传送一个中断符CTRL+CCTRL+C。 BOOL PurgeComm( BOOL PurgeComm( HANDLEHAN

10、DLE hFile hFile, , / /设备句柄设备句柄 DWORDDWORD dwFlags dwFlags / action to perform/ action to perform ); ); 该函数清空设备的输入或输出缓存,或者终止一个未完成的读该函数清空设备的输入或输出缓存,或者终止一个未完成的读 写操作。写操作。 串口相关函数详解 BOOL SetCommBreak( BOOL SetCommBreak( HANDLEHANDLE hFile hFile / / 设备句柄设备句柄 ); ); 该函数将指定通信设备的数据传输挂起,将数据线置于该函数将指定通信设备的数据传输挂起,

11、将数据线置于 BREAKBREAK状态,直到状态,直到ClearCommBreakClearCommBreak函数被调用。这里函数被调用。这里BREAKBREAK 并不是向串口设备发送的特殊的中断字符,而是通信线路的电气并不是向串口设备发送的特殊的中断字符,而是通信线路的电气 状态。状态。 BOOL ClearCommBreakBOOL ClearCommBreak(HANDLE HANDLE hFilehFile / / 设备句柄设备句柄); ); 该该 函数恢复指定通信设备的挂起的数据传输过程,并将数据线置于函数恢复指定通信设备的挂起的数据传输过程,并将数据线置于 NONBREAKNONB

12、REAK状态,参见状态,参见SetCommBreakSetCommBreak函数说明。函数说明。 BOOL ClearCommError( BOOL ClearCommError( HANDLEHANDLE hFilehFile, , / / 设备句柄设备句柄 LPDWORDLPDWORD lpErrorslpErrors, , / / 错误码错误码LPCOMSTATLPCOMSTAT lpStat lpStat / / 通信状态通信状态); ); 串口相关函数详解 当通信发生错误时,该函数获取通信的错误信息以及报告设当通信发生错误时,该函数获取通信的错误信息以及报告设 备的通信状态。并清除设

13、备的错误标志使得后续操作可以进行。备的通信状态。并清除设备的错误标志使得后续操作可以进行。 BOOL EscapeCommFunction( BOOL EscapeCommFunction( HANDLEHANDLE hFile hFile, , / / 设备句柄设备句柄 DWORDDWORD dwFunc dwFunc / / 执行函数执行函数 ); ); 该函数允许指定的通信设备执行该函数允许指定的通信设备执行dwFuncdwFunc参数指定的一个扩展参数指定的一个扩展 的功能函数,的功能函数,dwFuncdwFunc可取值如下:可取值如下: CLRDTRCLRDTR:清除:清除DTR(d

14、ata-terminal-ready)DTR(data-terminal-ready)信号。信号。 CLRRTSCLRRTS:清除:清除RTS(request-to-send) RTS(request-to-send) 信号。信号。 SETDTRSETDTR:发送:发送DTRDTR信号。信号。 SETRTSSETRTS:发送:发送RTSRTS信号。信号。 SETXOFFSETXOFF:启动数据传输,效仿收到:启动数据传输,效仿收到XOFFXOFF字符的情况。字符的情况。 SETXONSETXON:启动数据传输,效仿收到:启动数据传输,效仿收到XONXON字符的情况。字符的情况。 SETBREA

15、KSETBREAK:等同于调用:等同于调用SetCommBreakSetCommBreak函数。函数。 CLRBREAKCLRBREAK:等同于调用:等同于调用ClearClearCommBreakCommBreak函数。函数。 串口相关函数详解 BOOL WaitCommEvent( BOOL WaitCommEvent( HANDLEHANDLE hFile hFile, , / / 设备句柄设备句柄 LPDWORDLPDWORD lpEvtMask lpEvtMask, , / / 事件类型事件类型 LPOVERLAPPEDLPOVERLAPPED lpOverlapped lpOver

16、lapped/ overlapped / overlapped 结构指针结构指针 ); ); 根据参数根据参数lpOverlappedlpOverlapped是否为空,该函数以同步或异步是否为空,该函数以同步或异步IOIO的方式等待的方式等待 关心事件的发生,关心事件的类型由参数关心事件的发生,关心事件的类型由参数lpEvtMasklpEvtMask指定。指定。lpEvtMasklpEvtMask可可 取值如下:取值如下: EV_BREAKEV_BREAK检测到一个检测到一个BREAKBREAK信号信号. . EV_CTSEV_CTS CTS (clear-to-sendCTS (clear-

17、to-send,允许发送,允许发送) ) 信号状态改变信号状态改变. . EV_DSREV_DSR DSR (data-set-readyDSR (data-set-ready,数据设置就绪,数据设置就绪) )信号状态改变信号状态改变. . EV_ERREV_ERR 错误发生错误发生. . EV_RINGEV_RING检测到振铃信号检测到振铃信号. . EV_RLSDEV_RLSDRLSD(receive-line-signal-detect)RLSD(receive-line-signal-detect)信号状态改变信号状态改变. . EV_RXCHAREV_RXCHAR输入缓存接收到数据输

18、入缓存接收到数据. . EV_RXFLAGEV_RXFLAG输入缓存接收到事件字符输入缓存接收到事件字符. . EV_TXEMPTYEV_TXEMPTY输出缓存中的最后一个数据被发送输出缓存中的最后一个数据被发送. . 串口相关函数详解 配置类配置类 BOOL SetCommConfig( HANDLEBOOL SetCommConfig( HANDLE hCommDev hCommDev, , LPCOMMCONFIGLPCOMMCONFIG lpCC lpCC, DWORD, DWORD dwSize dwSize ); ); BOOL SetCommMask( HANDLEBOOL Se

19、tCommMask( HANDLE hFile hFile, DWORD, DWORD dwEvtMask dwEvtMask); ); BOOL SetCommState( HANDLEBOOL SetCommState( HANDLE hFile hFile, LPDCB, LPDCB lpDCB lpDCB ); ); BOOL SetCommTimeouts( HANDLEBOOL SetCommTimeouts( HANDLE hFile hFile, , LPCOMMTIMEOUTSLPCOMMTIMEOUTS lpCommTimeouts lpCommTimeouts ); );

20、 BOOL SetDefaultCommConfig( LPCTSTRBOOL SetDefaultCommConfig( LPCTSTR lpszName lpszName, , LPCOMMCONFIGLPCOMMCONFIG lpCC lpCC, DWORD, DWORD dwSize dwSize ); ); BOOL SetupComm( HANDLEBOOL SetupComm( HANDLE hFile hFile, DWORD, DWORD dwInQueue dwInQueue, , DWORDDWORD dwOutQueue dwOutQueue ); ); 串口相关函数详

21、解 配置类函数根据输入参数配置类函数根据输入参数/ /结构对串口进行配置,结构对串口进行配置, 每一个每一个SetSet* * *函数对应有一个函数对应有一个GetGet* * *函数用于获函数用于获 取当前配置。取当前配置。详细介绍请参阅详细介绍请参阅MSDNMSDN文档,这里文档,这里 我们仅对几个关键函数进行说明。我们仅对几个关键函数进行说明。 上面介绍的上面介绍的SetSet* * *函数中,除了函数中,除了SetCommMaskSetCommMask和和 SetupCommSetupComm外,入口参数中都有对应的配置结外,入口参数中都有对应的配置结 构,参阅相关结构的说明可以知道该

22、函数的作构,参阅相关结构的说明可以知道该函数的作 用。用。SetCommMaskSetCommMask函数用来指定关心的事件,函数用来指定关心的事件, 其参数其参数dwEvtMaskdwEvtMask与操作类函数中与操作类函数中 WaitCommEventWaitCommEvent的取值一致。下面说明的取值一致。下面说明 SetupCommSetupComm函数。函数。 串口相关函数详解 BOOL SetupComm( BOOL SetupComm( HANDLEHANDLE hFile hFile, , / / 设备句柄设备句柄 DWORDDWORD dwInQueue dwInQueue,

23、 , / / 推荐的输入缓存大小推荐的输入缓存大小 DWORDDWORD dwOutQueue dwOutQueue/ / 推荐的输出缓存大小推荐的输出缓存大小 ); ); 这里这里dwInQueuedwInQueue和和dwOutQueuedwOutQueue参数用来设置推参数用来设置推 荐的输入输出缓存大小,按字节计算。如果不设定,荐的输入输出缓存大小,按字节计算。如果不设定, 将使用缺省值。一种合适的缓存大小值为比设备通信将使用缺省值。一种合适的缓存大小值为比设备通信 帧的大小略大,比如对于基于以太网的通信设备(如帧的大小略大,比如对于基于以太网的通信设备(如 以太网卡),我们知道一个以

24、太帧的大小通常为以太网卡),我们知道一个以太帧的大小通常为15141514 字节,那么推荐值采用字节,那么推荐值采用16001600是比较合适的。是比较合适的。 串口相关函数详解 这里我们将该值称为这里我们将该值称为“推荐的推荐的”,其含义为:我们只,其含义为:我们只 是通过该函数通知设备的驱动程序,推荐使用这个值,是通过该函数通知设备的驱动程序,推荐使用这个值, 但驱动程序仍然可以根据实际情况采用不同的输入输但驱动程序仍然可以根据实际情况采用不同的输入输 出缓存机制,只要能够提供合理的性能并且保证当数出缓存机制,只要能够提供合理的性能并且保证当数 据长度超出缓冲区长度时数据不被丢失就可以了(

25、极据长度超出缓冲区长度时数据不被丢失就可以了(极 端情况除外)。比如说,驱动程序甚至可以不分配输端情况除外)。比如说,驱动程序甚至可以不分配输 入输出缓冲区,只要系统的其它模块提供等效的机制入输出缓冲区,只要系统的其它模块提供等效的机制 保证通信不出错就可以了。保证通信不出错就可以了。 串口相关函数详解 函数函数SetCommStateSetCommState函数根据入口参数中的函数根据入口参数中的DCBDCB结构结构 指针对串口设置进行调整。一般来讲,我们仅需对指针对串口设置进行调整。一般来讲,我们仅需对 DCBDCB结构中的少数几个域进行调整,因此,不应该结构中的少数几个域进行调整,因此,

26、不应该 直接填充该结构,好的做法是首先调用直接填充该结构,好的做法是首先调用 GetCommStateGetCommState函数获取当前的函数获取当前的DCBDCB结构,然后对关结构,然后对关 心的域进行调整。另外心的域进行调整。另外GetCommPropertiesGetCommProperties函数可函数可 以帮助获取设备的性能参数,比如设备支持的最大以帮助获取设备的性能参数,比如设备支持的最大 波特率值:波特率值:dwMaxBauddwMaxBaud。 串口相关函数详解 属性类属性类 BOOL GetCommProperties( BOOL GetCommProperties( HA

27、NDLEHANDLE hFile hFile, , / / 设备句柄设备句柄 LPCOMMPROPLPCOMMPROP lpCommProp lpCommProp / COMMPROP/ COMMPROP结构指针结构指针 ); ); 该函数获取指定通信设备的性能参数,并填充该函数获取指定通信设备的性能参数,并填充 lpCommProplpCommProp参数指向的参数指向的COMMPROPCOMMPROP结构。结构。 辅助类辅助类 BOOL BuildCommDCB( LPCTSTRBOOL BuildCommDCB( LPCTSTR lpDef lpDef, LPDCB, LPDCB lpD

28、CB lpDCB ); ); BOOL BuildCommDCBAndTimeouts( LPCTSTRBOOL BuildCommDCBAndTimeouts( LPCTSTR lpDef lpDef, , LPDCBLPDCB lpDCB lpDCB, LPCOMMTIMEOUTS , LPCOMMTIMEOUTS lpCommTimeouts lpCommTimeouts ); ); v这两个辅助类函数根据入口参数中的这两个辅助类函数根据入口参数中的lpDeflpDef字符串构字符串构 建相关的串口配置结构。更详细的说明参阅建相关的串口配置结构。更详细的说明参阅MSDNMSDN文文 档。

29、档。 串口相关函数详解 BOOL CommConfigDialog( BOOL CommConfigDialog( LPCTSTRLPCTSTR lpszName lpszName, , / / 设备名称设备名称 HWNDHWND hWnd hWnd, , / / 窗口句柄窗口句柄 LPCOMMCONFIGLPCOMMCONFIG lpCC lpCC / / 配置信息配置信息 ); ); 调用该函数将弹出一个指定的设备驱动程序支持调用该函数将弹出一个指定的设备驱动程序支持 的设备配置对话框,但该函数必须有硬件设备供应商的设备配置对话框,但该函数必须有硬件设备供应商 提供的提供的DLLDLL文件

30、支持。该函数的入口参数文件支持。该函数的入口参数lpCClpCC为一为一 个指向个指向COMMCONFIGCOMMCONFIG结构的指针,前面我们知道,结构的指针,前面我们知道, 对于不同的设备提供商,对于不同的设备提供商, COMMCONFIGCOMMCONFIG结构也可结构也可 能会有差异。能会有差异。 串口相关函数详解 其它可用函数其它可用函数 使用前面提到的使用前面提到的PurgeCommPurgeComm函数可以清空指定函数可以清空指定 通信设备的输入输出缓冲区,并且终止正在进通信设备的输入输出缓冲区,并且终止正在进 行的读写操作,但输出缓冲区中被删除的数据行的读写操作,但输出缓冲区

31、中被删除的数据 将不被发送。如果想清空输出缓冲区的同时保将不被发送。如果想清空输出缓冲区的同时保 证数据被发送,可以使用证数据被发送,可以使用FlushFileBuffersFlushFileBuffers函函 数,该函数入口参数为通信设备句柄,调用该数,该函数入口参数为通信设备句柄,调用该 函数将清空设备的输出缓冲区并确保数据被发函数将清空设备的输出缓冲区并确保数据被发 送,对于文件设备的情况,是将缓冲区中的数送,对于文件设备的情况,是将缓冲区中的数 据写入文件。但要注意的是,该函数的执行不据写入文件。但要注意的是,该函数的执行不 依赖依赖TimeOutTimeOut值,而是依赖于设备流控制

32、。值,而是依赖于设备流控制。 串行通信超时(Time-Outs)处理 串行通信超时串行通信超时(Time-Outs)(Time-Outs)处理处理: : COMMTIMEOUTSCOMMTIMEOUTS结构用来设置串口超时参数,当应用结构用来设置串口超时参数,当应用 程序打开一个串口设备时,系统设置设备的超时参数程序打开一个串口设备时,系统设置设备的超时参数 为设备最后一次使用时的数值,如果设备未被打开过,为设备最后一次使用时的数值,如果设备未被打开过, 则使用缺省值。合理的做法是:每次打开设备都应该则使用缺省值。合理的做法是:每次打开设备都应该 调用调用SetCommTimeoutsSetC

33、ommTimeouts函数对超时参数进行设置,查函数对超时参数进行设置,查 看当前超时参数设置,调用看当前超时参数设置,调用GetCommTimeoutsGetCommTimeouts函数。函数。 串行通信超时(Time-Outs)处理 WindowsWindows环境下的串行通信支持两种超时处理:环境下的串行通信支持两种超时处理: Interval time-outs Interval time-outs 和和 Total time-outsTotal time-outs。 Interval time-outs Interval time-outs 我们可以称之为字符间隔超时,我们可以称之为

34、字符间隔超时, 当接收两个字符的间隔时间超过指定的毫秒数时,超当接收两个字符的间隔时间超过指定的毫秒数时,超 时发生。时发生。Interval time-outsInterval time-outs每当收到一个字符时每当收到一个字符时 开始计时。开始计时。 Total time-outs Total time-outs 我们可以称之为操作总超时,当我们可以称之为操作总超时,当 一个读写操作消耗的时间超过指定的毫秒数时,超时一个读写操作消耗的时间超过指定的毫秒数时,超时 发生。发生。Total time-outsTotal time-outs当一个读写操作开始时开始当一个读写操作开始时开始 计时

35、。计时。 写操作仅支持操作总超时,读操作支持两种超时处理。写操作仅支持操作总超时,读操作支持两种超时处理。 串行通信超时(Time-Outs)处理 操作总超时(操作总超时(Total time-outsTotal time-outs)的值由)的值由COMMTIMEOUTSCOMMTIMEOUTS结结 构中的超时乘法因子和超时常量确定,使用如下公式:构中的超时乘法因子和超时常量确定,使用如下公式: Timeout = Timeout = (MULTIPLIER (MULTIPLIER * * number_of_bytes) + CONSTANT number_of_bytes) + CONST

36、ANT 使用超使用超 时因子和超时常量可以使操作超时时间根据读取的数据时因子和超时常量可以使操作超时时间根据读取的数据 量变化,这两个值也可以设置为量变化,这两个值也可以设置为0 0而只使用其中一个,如而只使用其中一个,如 果两个都为果两个都为0 0,则表示不使用操作总超时处理。,则表示不使用操作总超时处理。 如果所有读操作超时参数都为如果所有读操作超时参数都为0 0,则不使用读操作超时,则不使用读操作超时, 这种情况下,对于一个读操作,直到请求字节数的数据这种情况下,对于一个读操作,直到请求字节数的数据 全部被读出或者某种错误发生,操作才会返回。写操作全部被读出或者某种错误发生,操作才会返回

37、。写操作 的情况类似。的情况类似。 串行通信超时(Time-Outs)处理 如果读操作的字符间隔超时参数设置为如果读操作的字符间隔超时参数设置为 MAXDWORD MAXDWORD (0 xffffffff0 xffffffff,等价于,等价于INFINITEINFINITE),), 而操作总超时参数超时乘法因子和超时常量值而操作总超时参数超时乘法因子和超时常量值 均设为均设为0 0,那么一个读操作将在读取了输入缓,那么一个读操作将在读取了输入缓 存中的任何字符后立即返回,即使缓存为空。存中的任何字符后立即返回,即使缓存为空。 字符间隔超时当一个读操作过程中数据传输出字符间隔超时当一个读操作过

38、程中数据传输出 现停顿时使操作返回。使用字符间隔超时并设现停顿时使操作返回。使用字符间隔超时并设 置一个合适的超时时间,可以对少量字符传送置一个合适的超时时间,可以对少量字符传送 的情况作出迅速反应,也可以使用一个读操作的情况作出迅速反应,也可以使用一个读操作 在一个稳定数据流的情况下接收一批数据。在一个稳定数据流的情况下接收一批数据。 串行通信超时(Time-Outs)处理 如果应用程序设置字符间隔超时和操作总超时的乘如果应用程序设置字符间隔超时和操作总超时的乘 法因子均为法因子均为MAX_WORDMAX_WORD,而将操作总超时的超时常量,而将操作总超时的超时常量 设为大于设为大于0 0小

39、于小于MAX_WORDMAX_WORD的一个值,那么在调用的一个值,那么在调用 ReadFileReadFile时,以下三种情况可能发生:时,以下三种情况可能发生: 1.1.如果输入缓冲区中有字符,如果输入缓冲区中有字符,ReadFileReadFile读取缓冲区读取缓冲区 中的字符并立即返回。中的字符并立即返回。 2.2.如果输入缓冲区中没有字符,在超时常量指定的如果输入缓冲区中没有字符,在超时常量指定的 时间内,时间内,ReadFileReadFile等候直到有一个字符到达后立等候直到有一个字符到达后立 即返回。即返回。 3.3.如果输入缓冲区中没有字符,并且在超时常量指如果输入缓冲区中没

40、有字符,并且在超时常量指 定的时间内没有收到任何字符,定的时间内没有收到任何字符,ReadFileReadFile超时。超时。 Windows串口通信实现方式 在实现通用串口类之前,我们先介绍实现串口在实现通用串口类之前,我们先介绍实现串口 通信的方式。通信的方式。 讨论:有些资料中把串口的通信方式分为以下四种:讨论:有些资料中把串口的通信方式分为以下四种: 同步通信方式同步通信方式 查询(轮询)方式查询(轮询)方式 异步通信方式异步通信方式 事件驱动方式事件驱动方式 这样的划分其实并不合理,因为同步或异步指的是读这样的划分其实并不合理,因为同步或异步指的是读 写操作的不同机制,而轮询或事件驱

41、动,指的是判断写操作的不同机制,而轮询或事件驱动,指的是判断 应该何时去读写设备的方式。对于轮询或事件驱动方应该何时去读写设备的方式。对于轮询或事件驱动方 式中对设备的读写,既可以使用同步方式,也可以使式中对设备的读写,既可以使用同步方式,也可以使 用异步方式。用异步方式。 Windows串口通信实现方式 对于设备对于设备IOIO的同步和异步方式,我们在前面的的同步和异步方式,我们在前面的 “WindowsWindows设备通信基础设备通信基础”和和“WindowsWindows异步异步IOIO 技术技术”中已经做了详细的介绍,这里不再做过中已经做了详细的介绍,这里不再做过 多的讨论。下面介绍

42、轮询和事件驱动方式。多的讨论。下面介绍轮询和事件驱动方式。 轮询:轮询是设备驱动程序处理轮询:轮询是设备驱动程序处理IOIO常见的方式,常见的方式, 即驱动程序按照一定的时间间隔检查是否有数即驱动程序按照一定的时间间隔检查是否有数 据输入。对于串口通信,上层应用程序也可以据输入。对于串口通信,上层应用程序也可以 使用轮询的方式,即按照一定的超时设置定时使用轮询的方式,即按照一定的超时设置定时 检查串口设备的输入缓冲区是否有数据进入。检查串口设备的输入缓冲区是否有数据进入。 Windows串口通信实现方式 事件驱动方式:应用程序可以通过事件驱动方式:应用程序可以通过 SetCommMaskSetCommMask函数设定所关心的串口事件,并函数设定所关心的串口事件,并 调用调用WaitCommEventWaitCommEvent进行等待,

温馨提示

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

最新文档

评论

0/150

提交评论