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

3、IGCOMMCONFIG。该结构中也包含了。该结构中也包含了DCBDCB结构。结构。设备操作相关结构,结构名称:设备操作相关结构,结构名称:COMMTIMEOUTSCOMMTIMEOUTS,用于设置,用于设置串口操作的各种超时。该结构可以配置和获取。串口操作的各种超时。该结构可以配置和获取。1.1.设备状态结构,用于获取串口运行状态。结构名称:设备状态结构,用于获取串口运行状态。结构名称:COMMSTATCOMMSTAT。串口相关结构详解对于串口相关结构的详细介绍,请参阅对于串口相关结构的详细介绍,请参阅MSDNMSDN文档,这文档,这里我们仅对几个结构的关键域进行说明。里我们仅对几个结构的关

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

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

6、tCommConfig函数获取当函数获取当前的前的COMMCONFIGCOMMCONFIG结构,然后调用结构,然后调用SetCommConfigSetCommConfig函数函数对关心的域进行填充。相关的函数还有对关心的域进行填充。相关的函数还有GetDefaultCommConfigGetDefaultCommConfig和和SetDefaultCommConfigSetDefaultCommConfig,以及以及CommConfigDialogCommConfigDialog函数。函数。关于结构关于结构COMMTIMEOUTSCOMMTIMEOUTS,我们将在后面的,我们将在后面的Time

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

8、于串口设备通信的函数。我们可以将其分为几类:以将其分为几类:操作类操作类属性类属性类配置类配置类辅助类辅助类串口相关函数详解操作类操作类对串口的操作除了通常的对串口的操作除了通常的CreateFile, ReadFile, WriteFileCreateFile, ReadFile, WriteFile等等函数之外,函数之外,Win32Win32还提供了以下函数:还提供了以下函数:BOOL TransmitCommChar (BOOL TransmitCommChar (HANDLE HANDLE hFile,hFile,/ / 设备句柄设备句柄char cCharchar cChar/ /

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

10、/ action to perform); ); 该函数清空设备的输入或输出缓存,或者终止一个未完成的读该函数清空设备的输入或输出缓存,或者终止一个未完成的读写操作。写操作。串口相关函数详解BOOL SetCommBreak( BOOL SetCommBreak( HANDLEHANDLE hFile hFile / / 设备句柄设备句柄); );该函数将指定通信设备的数据传输挂起,将数据线置于该函数将指定通信设备的数据传输挂起,将数据线置于BREAKBREAK状态,直到状态,直到ClearCommBreakClearCommBreak函数被调用。这里函数被调用。这里BREAKBREAK并不是

11、向串口设备发送的特殊的中断字符,而是通信线路的电气并不是向串口设备发送的特殊的中断字符,而是通信线路的电气状态。状态。BOOL ClearCommBreakBOOL ClearCommBreak(HANDLE HANDLE hFilehFile / / 设备句柄设备句柄); );该该函数恢复指定通信设备的挂起的数据传输过程,并将数据线置于函数恢复指定通信设备的挂起的数据传输过程,并将数据线置于NONBREAKNONBREAK状态,参见状态,参见SetCommBreakSetCommBreak函数说明。函数说明。BOOL ClearCommError( BOOL ClearCommError(

12、HANDLEHANDLE hFilehFile, , / / 设备句柄设备句柄 LPDWORDLPDWORD lpErrorslpErrors, , / / 错误码错误码LPCOMSTATLPCOMSTAT lpStat lpStat / / 通信状态通信状态); );串口相关函数详解当通信发生错误时,该函数获取通信的错误信息以及报告设当通信发生错误时,该函数获取通信的错误信息以及报告设备的通信状态。并清除设备的错误标志使得后续操作可以进行。备的通信状态。并清除设备的错误标志使得后续操作可以进行。BOOL EscapeCommFunction( BOOL EscapeCommFunction(

13、 HANDLEHANDLE hFile hFile, , / / 设备句柄设备句柄DWORDDWORD dwFunc dwFunc / / 执行函数执行函数); ); 该函数允许指定的通信设备执行该函数允许指定的通信设备执行dwFuncdwFunc参数指定的一个扩展参数指定的一个扩展的功能函数,的功能函数,dwFuncdwFunc可取值如下:可取值如下:CLRDTRCLRDTR:清除:清除DTR(data-terminal-ready)DTR(data-terminal-ready)信号。信号。CLRRTSCLRRTS:清除:清除RTS(request-to-send) RTS(request

14、-to-send) 信号。信号。SETDTRSETDTR:发送:发送DTRDTR信号。信号。SETRTSSETRTS:发送:发送RTSRTS信号。信号。SETXOFFSETXOFF:启动数据传输,效仿收到:启动数据传输,效仿收到XOFFXOFF字符的情况。字符的情况。SETXONSETXON:启动数据传输,效仿收到:启动数据传输,效仿收到XONXON字符的情况。字符的情况。SETBREAKSETBREAK:等同于调用:等同于调用SetCommBreakSetCommBreak函数。函数。CLRBREAKCLRBREAK:等同于调用:等同于调用ClearClearCommBreakCommBre

15、ak函数。函数。串口相关函数详解BOOL WaitCommEvent( BOOL WaitCommEvent( HANDLEHANDLE hFile hFile, , / / 设备句柄设备句柄LPDWORDLPDWORD lpEvtMask lpEvtMask, , / / 事件类型事件类型 LPOVERLAPPEDLPOVERLAPPED lpOverlapped lpOverlapped/ overlapped / overlapped 结构指针结构指针); );根据参数根据参数lpOverlappedlpOverlapped是否为空,该函数以同步或异步是否为空,该函数以同步或异步IOIO

16、的方式等待的方式等待关心事件的发生,关心事件的类型由参数关心事件的发生,关心事件的类型由参数lpEvtMasklpEvtMask指定。指定。lpEvtMasklpEvtMask可可取值如下:取值如下:EV_BREAKEV_BREAK检测到一个检测到一个BREAKBREAK信号信号. .EV_CTSEV_CTS CTS (clear-to-sendCTS (clear-to-send,允许发送,允许发送) ) 信号状态改变信号状态改变. .EV_DSREV_DSR DSR (data-set-readyDSR (data-set-ready,数据设置就绪,数据设置就绪) )信号状态改变信号状态改

17、变. .EV_ERREV_ERR 错误发生错误发生. .EV_RINGEV_RING检测到振铃信号检测到振铃信号. .EV_RLSDEV_RLSDRLSD(receive-line-signal-detect)RLSD(receive-line-signal-detect)信号状态改变信号状态改变. .EV_RXCHAREV_RXCHAR输入缓存接收到数据输入缓存接收到数据. .EV_RXFLAGEV_RXFLAG输入缓存接收到事件字符输入缓存接收到事件字符. .EV_TXEMPTYEV_TXEMPTY输出缓存中的最后一个数据被发送输出缓存中的最后一个数据被发送. .串口相关函数详解配置类配置

18、类BOOL SetCommConfig( HANDLEBOOL SetCommConfig( HANDLE hCommDev hCommDev, , LPCOMMCONFIGLPCOMMCONFIG lpCC lpCC, DWORD, DWORD dwSize dwSize ); ); BOOL SetCommMask( HANDLEBOOL SetCommMask( HANDLE hFile hFile, DWORD, DWORD dwEvtMask dwEvtMask); ); BOOL SetCommState( HANDLEBOOL SetCommState( HANDLE hFile

19、 hFile, LPDCB, LPDCB lpDCB lpDCB ); ); BOOL SetCommTimeouts( HANDLEBOOL SetCommTimeouts( HANDLE hFile hFile, , LPCOMMTIMEOUTSLPCOMMTIMEOUTS lpCommTimeouts lpCommTimeouts ); ); BOOL SetDefaultCommConfig( LPCTSTRBOOL SetDefaultCommConfig( LPCTSTR lpszName lpszName, , LPCOMMCONFIGLPCOMMCONFIG lpCC lpCC

20、, DWORD, DWORD dwSize dwSize ); ); BOOL SetupComm( HANDLEBOOL SetupComm( HANDLE hFile hFile, DWORD, DWORD dwInQueue dwInQueue, , DWORDDWORD dwOutQueue dwOutQueue ); ); 串口相关函数详解配置类函数根据输入参数配置类函数根据输入参数/ /结构对串口进行配置,结构对串口进行配置,每一个每一个SetSet* * *函数对应有一个函数对应有一个GetGet* * *函数用于获函数用于获取当前配置。取当前配置。详细介绍请参阅详细介绍请参阅M

21、SDNMSDN文档,这里文档,这里我们仅对几个关键函数进行说明。我们仅对几个关键函数进行说明。上面介绍的上面介绍的SetSet* * *函数中,除了函数中,除了SetCommMaskSetCommMask和和SetupCommSetupComm外,入口参数中都有对应的配置结外,入口参数中都有对应的配置结构,参阅相关结构的说明可以知道该函数的作构,参阅相关结构的说明可以知道该函数的作用。用。SetCommMaskSetCommMask函数用来指定关心的事件,函数用来指定关心的事件,其参数其参数dwEvtMaskdwEvtMask与操作类函数中与操作类函数中WaitCommEventWaitCom

22、mEvent的取值一致。下面说明的取值一致。下面说明SetupCommSetupComm函数。函数。串口相关函数详解BOOL SetupComm( BOOL SetupComm( HANDLEHANDLE hFile hFile, , / / 设备句柄设备句柄DWORDDWORD dwInQueue dwInQueue, , / / 推荐的输入缓存大小推荐的输入缓存大小DWORDDWORD dwOutQueue dwOutQueue/ / 推荐的输出缓存大小推荐的输出缓存大小 ); );这里这里dwInQueuedwInQueue和和dwOutQueuedwOutQueue参数用来设置推参数用

23、来设置推荐的输入输出缓存大小,按字节计算。如果不设定,荐的输入输出缓存大小,按字节计算。如果不设定,将使用缺省值。一种合适的缓存大小值为比设备通信将使用缺省值。一种合适的缓存大小值为比设备通信帧的大小略大,比如对于基于以太网的通信设备(如帧的大小略大,比如对于基于以太网的通信设备(如以太网卡),我们知道一个以太帧的大小通常为以太网卡),我们知道一个以太帧的大小通常为15141514字节,那么推荐值采用字节,那么推荐值采用16001600是比较合适的。是比较合适的。串口相关函数详解这里我们将该值称为这里我们将该值称为“推荐的推荐的”,其含义为:我们只,其含义为:我们只是通过该函数通知设备的驱动程

24、序,推荐使用这个值,是通过该函数通知设备的驱动程序,推荐使用这个值,但驱动程序仍然可以根据实际情况采用不同的输入输但驱动程序仍然可以根据实际情况采用不同的输入输出缓存机制,只要能够提供合理的性能并且保证当数出缓存机制,只要能够提供合理的性能并且保证当数据长度超出缓冲区长度时数据不被丢失就可以了(极据长度超出缓冲区长度时数据不被丢失就可以了(极端情况除外)。比如说,驱动程序甚至可以不分配输端情况除外)。比如说,驱动程序甚至可以不分配输入输出缓冲区,只要系统的其它模块提供等效的机制入输出缓冲区,只要系统的其它模块提供等效的机制保证通信不出错就可以了。保证通信不出错就可以了。串口相关函数详解函数函数

25、SetCommStateSetCommState函数根据入口参数中的函数根据入口参数中的DCBDCB结构结构指针对串口设置进行调整。一般来讲,我们仅需对指针对串口设置进行调整。一般来讲,我们仅需对DCBDCB结构中的少数几个域进行调整,因此,不应该结构中的少数几个域进行调整,因此,不应该直接填充该结构,好的做法是首先调用直接填充该结构,好的做法是首先调用GetCommStateGetCommState函数获取当前的函数获取当前的DCBDCB结构,然后对关结构,然后对关心的域进行调整。另外心的域进行调整。另外GetCommPropertiesGetCommProperties函数可函数可以帮助获

26、取设备的性能参数,比如设备支持的最大以帮助获取设备的性能参数,比如设备支持的最大波特率值:波特率值:dwMaxBauddwMaxBaud。串口相关函数详解属性类属性类BOOL GetCommProperties( BOOL GetCommProperties( HANDLEHANDLE hFile hFile, , / / 设备句柄设备句柄 LPCOMMPROPLPCOMMPROP lpCommProp lpCommProp / COMMPROP/ COMMPROP结构指针结构指针); );该函数获取指定通信设备的性能参数,并填充该函数获取指定通信设备的性能参数,并填充lpCommProplp

27、CommProp参数指向的参数指向的COMMPROPCOMMPROP结构。结构。辅助类辅助类BOOL BuildCommDCB( LPCTSTRBOOL BuildCommDCB( LPCTSTR lpDef lpDef, LPDCB, LPDCB lpDCB lpDCB ); ); BOOL BuildCommDCBAndTimeouts( LPCTSTRBOOL BuildCommDCBAndTimeouts( LPCTSTR lpDef lpDef, , LPDCBLPDCB lpDCB lpDCB, LPCOMMTIMEOUTS , LPCOMMTIMEOUTS lpCommTimeo

28、uts lpCommTimeouts ); ); v这两个辅助类函数根据入口参数中的这两个辅助类函数根据入口参数中的lpDeflpDef字符串构字符串构建相关的串口配置结构。更详细的说明参阅建相关的串口配置结构。更详细的说明参阅MSDNMSDN文文档。档。串口相关函数详解BOOL CommConfigDialog( BOOL CommConfigDialog( LPCTSTRLPCTSTR lpszName lpszName, , / / 设备名称设备名称 HWNDHWND hWnd hWnd, , / / 窗口句柄窗口句柄 LPCOMMCONFIGLPCOMMCONFIG lpCC lpCC

29、 / / 配置信息配置信息); );调用该函数将弹出一个指定的设备驱动程序支持调用该函数将弹出一个指定的设备驱动程序支持的设备配置对话框,但该函数必须有硬件设备供应商的设备配置对话框,但该函数必须有硬件设备供应商提供的提供的DLLDLL文件支持。该函数的入口参数文件支持。该函数的入口参数lpCClpCC为一为一个指向个指向COMMCONFIGCOMMCONFIG结构的指针,前面我们知道,结构的指针,前面我们知道,对于不同的设备提供商,对于不同的设备提供商, COMMCONFIGCOMMCONFIG结构也可结构也可能会有差异。能会有差异。串口相关函数详解其它可用函数其它可用函数使用前面提到的使用

30、前面提到的PurgeCommPurgeComm函数可以清空指定函数可以清空指定通信设备的输入输出缓冲区,并且终止正在进通信设备的输入输出缓冲区,并且终止正在进行的读写操作,但输出缓冲区中被删除的数据行的读写操作,但输出缓冲区中被删除的数据将不被发送。如果想清空输出缓冲区的同时保将不被发送。如果想清空输出缓冲区的同时保证数据被发送,可以使用证数据被发送,可以使用FlushFileBuffersFlushFileBuffers函函数,该函数入口参数为通信设备句柄,调用该数,该函数入口参数为通信设备句柄,调用该函数将清空设备的输出缓冲区并确保数据被发函数将清空设备的输出缓冲区并确保数据被发送,对于文

31、件设备的情况,是将缓冲区中的数送,对于文件设备的情况,是将缓冲区中的数据写入文件。但要注意的是,该函数的执行不据写入文件。但要注意的是,该函数的执行不依赖依赖TimeOutTimeOut值,而是依赖于设备流控制。值,而是依赖于设备流控制。串行通信超时(Time-Outs)处理串行通信超时串行通信超时(Time-Outs)(Time-Outs)处理处理: :COMMTIMEOUTSCOMMTIMEOUTS结构用来设置串口超时参数,当应用结构用来设置串口超时参数,当应用程序打开一个串口设备时,系统设置设备的超时参数程序打开一个串口设备时,系统设置设备的超时参数为设备最后一次使用时的数值,如果设备未

32、被打开过,为设备最后一次使用时的数值,如果设备未被打开过,则使用缺省值。合理的做法是:每次打开设备都应该则使用缺省值。合理的做法是:每次打开设备都应该调用调用SetCommTimeoutsSetCommTimeouts函数对超时参数进行设置,查函数对超时参数进行设置,查看当前超时参数设置,调用看当前超时参数设置,调用GetCommTimeoutsGetCommTimeouts函数。函数。串行通信超时(Time-Outs)处理WindowsWindows环境下的串行通信支持两种超时处理:环境下的串行通信支持两种超时处理:Interval time-outs Interval time-outs

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

34、时一个读写操作消耗的时间超过指定的毫秒数时,超时发生。发生。Total time-outsTotal time-outs当一个读写操作开始时开始当一个读写操作开始时开始计时。计时。写操作仅支持操作总超时,读操作支持两种超时处理。写操作仅支持操作总超时,读操作支持两种超时处理。串行通信超时(Time-Outs)处理操作总超时(操作总超时(Total time-outsTotal time-outs)的值由)的值由COMMTIMEOUTSCOMMTIMEOUTS结结构中的超时乘法因子和超时常量确定,使用如下公式:构中的超时乘法因子和超时常量确定,使用如下公式: Timeout = Timeout

35、= (MULTIPLIER (MULTIPLIER * * number_of_bytes) + CONSTANT number_of_bytes) + CONSTANT 使用超使用超时因子和超时常量可以使操作超时时间根据读取的数据时因子和超时常量可以使操作超时时间根据读取的数据量变化,这两个值也可以设置为量变化,这两个值也可以设置为0 0而只使用其中一个,如而只使用其中一个,如果两个都为果两个都为0 0,则表示不使用操作总超时处理。,则表示不使用操作总超时处理。如果所有读操作超时参数都为如果所有读操作超时参数都为0 0,则不使用读操作超时,则不使用读操作超时,这种情况下,对于一个读操作,直到

36、请求字节数的数据这种情况下,对于一个读操作,直到请求字节数的数据全部被读出或者某种错误发生,操作才会返回。写操作全部被读出或者某种错误发生,操作才会返回。写操作的情况类似。的情况类似。串行通信超时(Time-Outs)处理如果读操作的字符间隔超时参数设置为如果读操作的字符间隔超时参数设置为MAXDWORD MAXDWORD (0 xffffffff0 xffffffff,等价于,等价于INFINITEINFINITE),),而操作总超时参数超时乘法因子和超时常量值而操作总超时参数超时乘法因子和超时常量值均设为均设为0 0,那么一个读操作将在读取了输入缓,那么一个读操作将在读取了输入缓存中的任何

37、字符后立即返回,即使缓存为空。存中的任何字符后立即返回,即使缓存为空。字符间隔超时当一个读操作过程中数据传输出字符间隔超时当一个读操作过程中数据传输出现停顿时使操作返回。使用字符间隔超时并设现停顿时使操作返回。使用字符间隔超时并设置一个合适的超时时间,可以对少量字符传送置一个合适的超时时间,可以对少量字符传送的情况作出迅速反应,也可以使用一个读操作的情况作出迅速反应,也可以使用一个读操作在一个稳定数据流的情况下接收一批数据。在一个稳定数据流的情况下接收一批数据。串行通信超时(Time-Outs)处理如果应用程序设置字符间隔超时和操作总超时的乘如果应用程序设置字符间隔超时和操作总超时的乘法因子均

38、为法因子均为MAX_WORDMAX_WORD,而将操作总超时的超时常量,而将操作总超时的超时常量设为大于设为大于0 0小于小于MAX_WORDMAX_WORD的一个值,那么在调用的一个值,那么在调用ReadFileReadFile时,以下三种情况可能发生:时,以下三种情况可能发生:如果输入缓冲区中有字符,如果输入缓冲区中有字符,ReadFileReadFile读取缓冲区读取缓冲区中的字符并立即返回。中的字符并立即返回。如果输入缓冲区中没有字符,在超时常量指定的如果输入缓冲区中没有字符,在超时常量指定的时间内,时间内,ReadFileReadFile等候直到有一个字符到达后立等候直到有一个字符到

39、达后立即返回。即返回。1.1.如果输入缓冲区中没有字符,并且在超时常量指如果输入缓冲区中没有字符,并且在超时常量指定的时间内没有收到任何字符,定的时间内没有收到任何字符,ReadFileReadFile超时。超时。Windows串口通信实现方式在实现通用串口类之前,我们先介绍实现串口在实现通用串口类之前,我们先介绍实现串口通信的方式。通信的方式。讨论:有些资料中把串口的通信方式分为以下四种:讨论:有些资料中把串口的通信方式分为以下四种:同步通信方式同步通信方式查询(轮询)方式查询(轮询)方式异步通信方式异步通信方式事件驱动方式事件驱动方式这样的划分其实并不合理,因为同步或异步指的是读这样的划分

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

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

温馨提示

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

评论

0/150

提交评论