WIN_API串口通信详细讲解带范例程序说明.doc_第1页
WIN_API串口通信详细讲解带范例程序说明.doc_第2页
WIN_API串口通信详细讲解带范例程序说明.doc_第3页
WIN_API串口通信详细讲解带范例程序说明.doc_第4页
WIN_API串口通信详细讲解带范例程序说明.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

WIN32 API串口通讯实例教程第一节 实现串口通讯的函数及串口编程简介API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作。常用函数及作用下:函数名 作用 CreateFile 打开串口 GetCommState 检测串口设置 SetCommState 设置串口 BuilderCommDCB 用字符串中的值来填充设备控制块 GetCommTimeouts 检测通信超时设置 SetCommTimeouts 设置通信超时参数 SetCommMask 设定被监控事件 WaitCommEvent 等待被监控事件发生 WaitForMultipleObjects 等待多个被监测对象的结果 WriteFile 发送数据 ReadFile 接收数据 GetOverlappedResult 返回最后重叠(异步)操作结果 PurgeComm 清空串口缓冲区,退出所有相关操作 ClearCommError 更新串口状态结构体,并清除所有串口硬件错误 CloseHandle 关闭串行口用Windows API 编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更高。 API编写串口,过程一般是这样的: 1、 创建串口句柄,用CreateFile; 2、 对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port); 3、 然后对串口进行相应的读写操作,这时候用到ReadFile和WriteFile函数;4、 读写结束后,要关闭串口句柄,用CloseFile。下面依次讲述各个步骤的过程。第二节 创建串口句柄打开串口从字面上去理解,大家也可以发现CreateFile实际上表明Windows是把串口当作一个文件来处理的,所以它也有文件那样的缓冲区、句柄、读写错误等,不同的是,这个文件名字只有固定的几个(一般为四个),而且始终存在(EXSITING),而且在调用CreateFile的时候请注意它的参数。CreateFile函数原型如下: HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );lpFileName:指向一个以NULL结束的字符串,该串指定了要创建、打开或截断的文件、管道、通信源、磁盘设备或控制台的名字。当用CreateFile打开串口时,这个参数可用“COM1”指定串口1,用“COM2”指定串口2,依此类推。dwDesireAccess: 指定对文件访问的类型,该参数可以为GENERIC_READ(指定对该文件的读访问权)或GENERIC_WRITE(指定该文件的写访问权)两个值之一或同时为为这两个值。用ENERIC_READ|GENERIC_WRITE则指定可对串口进行读写;dwShareMode:指定此文件可以怎样被共享。因为串行口不支持任何共享模式,所以dwShareMode必须设为;lpSecurityAttributes定义安全属性,一般不用,可设为NULL。Win 9x下该参数被忽略;dwCreationDistribution定义文件创建方式, 对串口必须设为OPEN_EXISTING,表示打开已经存在的文件;dwFlagsAndAttributes为该文件指定定义文件属性和标志,这个程序中设为FILE_FLAG_OVERLAPPED,表示异步通信方式; hTemplateFile 指向一个模板文件的句柄,串口无模板可言,设为NULL。在 Windows 9x下该参数必须为NULL。串口被成功打开时,返回其句柄,否则返回INVALID_HANDLE_value(0XFFFFFFFF)。上面说到了异步,那什么是异步呢?异步是相对同步这个概念而言的。异步,就是说,在进行串口读写操作时,不用等到I/O操作完成后函数才返回,也就是说,异步可以更快得响应用户操作;同步,相反,响应的I/O操作必须完成后函数才返回,否则阻塞线程。对于一些很简单的通讯程序来说,可以选择同步,这样可以省去很多错误检查,但是对于复杂一点的应用程序,异步是最佳选择。实例1:/* example1.cpp */* lishaoan 2009-06-29 */* */#include #include #include bool openport(char *portname)/打开串口HANDLE hComm;hComm = CreateFile(portname, /串口号 GENERIC_READ | GENERIC_WRITE, /允许读写 0, /通讯设备必须以独占方式打开 0, /无安全属性 OPEN_EXISTING, /通讯设备已存在 FILE_FLAG_OVERLAPPED, /异步I/O 0); /通讯设备不能用模板打开if (hComm = INVALID_HANDLE_VALUE)CloseHandle(hComm);return FALSE;elsereturn true;void main()bool open;open=openport(com2);if(open)printf(open comport success);system(pause) ;/* program end*/实例2:/* example2.cpp */* lishaoan 2009-06-29 */* */#include #include #include bool openport(char *portname)/打开串口HANDLE hComm;hComm = CreateFile(portname, /串口号 GENERIC_READ | GENERIC_WRITE, /允许读写 0, /通讯设备必须以独占方式打开 0, /无安全属性 OPEN_EXISTING, /通讯设备已存在 0, /同步I/O 0); /通讯设备不能用模板打开if (hComm = INVALID_HANDLE_VALUE)CloseHandle(hComm);return FALSE;elsereturn true;void main()bool open;open=openport(com2);if(open)printf(open comport success);system(pause) ;/* program end*/第三节 设置串口在打开通信设备句柄后,常常需要对串行口进行一些初始化工作。这需要通过一个DCB结构来进行。DCB结构包含了诸如波特率、每个字符的数据位数、奇偶校验和停止位数等信息。在查询或配置串口的属性时,都要用DCB结构来作为缓冲区。第一次打开串口时,串口设置为系统默认值,函数GetCommState和SetCommState可用于检索和设定端口设置的DCB(设备控制块)结构,该结构中BaudRate、ByteSize、StopBits和Parity字段含有串口波特率、数据位数、停止位和奇偶校验控制等信息。程序中用DCB进行串口设置时,应先调用API函数GetCommState,来获得串口的设置信息: GetCommState() 用途:取得串口当前状态 原型:BOOL GetCommState(HANDLE hFile, LPDCB lpDCB); 参数说明: -hFile:串口句柄 -lpDCB:设备控制块(Device Control Block)结构地址。此结构中含有和设备相关的参数。此处是与串口相关的参数。由于参数非常多,当需要设置串口参数时,通常是先取得串口的参数结构,修改部分参数后再将参数结构写入。然后在需要设置的地方对dcb进行设置。串口有很多的属性,上面也已经介绍了一些最重要的参数。这里介绍数据结构DCB:typedef struct _DCB / dcb DWORD DCBlength; /DCB结构体大小 DWORD BaudRate; /波特率 DWORD fBinary: 1; /是否是二进制,一般设置为TRUE DWORD fParity: 1;/是否进行奇偶校验 DWORD fOutxCtsFlow:1; /CTS线上的硬件握手 DWORD fOutxDsrFlow:1; /DSR线上的硬件握手 DWORD fDtrControl:2; /DTR控制 DWORD fDsrSensitivity:1; / DSR sensitivity DWORD fTXContinueOnXoff:1; / XOFF continues Tx DWORD fOutX: 1; /是否使用XON/XOFF协议 DWORD fInX: 1; /是否使用XON/XOFF协议 DWORD fErrorChar: 1; /发送错误协议 DWORD fNull: 1; / enable null stripping DWORD fRtsControl:2; / RTS flow control DWORD fAbortOnError:1; / abort reads/writes on error DWORD fDummy2:17; / reserved WORD wReserved; / not currently used WORD XonLim; /设置在XON字符发送之前inbuf中允许的最少字节数 WORD XoffLim; /在发送XOFF字符之前outbuf中允许的最多字节数 BYTE ByteSize; /数据宽度,一般为8,有时候为7 BYTE Parity; /奇偶校验 BYTE StopBits; /停止位数 char XonChar; /设置表示XON字符的字符,一般是采用0x11这个数值 char XoffChar; /设置表示XOFF字符的字符,一般是采用0x13这个数值 char ErrorChar; / error replacement character char EofChar; / end of input character char EvtChar; / received event characterWORD wReserved1; / reserved; do not use DCB; 我们真正在串口编程中用到的数据成员没有几个,在此仅介绍少数的几个常用的参数: DWORD BaudRate:串口波特率 DWORD fParity:为1的话激活奇偶校验检查 DWORD Parity:校验方式,值04分别对应无校验、奇校验、偶校验、校验置位、校验清零 DWORD ByteSize:一个字节的数据位个数,范围是58 DWORD StopBits:停止位个数,02分别对应1位、1.5位、2位停止位 然后再末尾调用SetCommState就可以了,还是比较方便的。这样可不必构造一个完整的DCB结构。SetCommState() 用途:设置串口状态,包括常用的更改串口号、波特率、奇偶校验方式、数据位数等 原型:BOOL SetCommState(HANDLE hFile, LPDCB lpDCB); 参数说明: -hFile:串口句柄 -lpDCB:设备控制块(Device Control Block)结构地址。要更改的串口参数包含在此结构中。然后调用SetCommMask,用来指定程序接收特定的串口事件,调用SetupComm函数,设置串口缓冲区大小: SetCommMask()说明:用途:设置串口通信事件。 原型:BOOL SetCommMask(HANDLE hFile, DWORD dwEvtMask ); 参数说明: -hFile:串口句柄 -dwEvtMask:准备监视的串口事件掩码 该参数有如下信息掩码位值: EV_BREAK:收到BREAK信号 EV_CTS:CTS(clear to send)线路发生变化 EV_DSR:DST(Data Set Ready)线路发生变化 EV_ERR:线路状态错误,包括了CE_FRAMECE_OVERRUNCE_RXPARITY 3钟错误。 EV_RING:检测到振铃信号。 EV_RLSD:CD(Carrier Detect)线路信号发生变化。 EV_RXCHAR:输入缓冲区中已收到数据。 EV_RXFLAG:使用SetCommState()函数设置的DCB结构中的等待字符已被传入输入缓冲区中。 EV_TXEMPTY:输出缓冲区中的数据已被完全送出。还有,串口因为是I/O操作,可能会产生错误,这时候需要用SetCommTimeouts()设置超时限制,以避免阻塞现象。设置超时设置需要一个结构体COMMTIMEOUTS。SetCommTimeouts()BOOL SetCommTimeouts( hCommDev, lpctmo );Lpctmo指向包含新的超时参数的COMMTIMEOUTS结构。COMMTIMEOUTS结构定义如下:typedef struct _ COMMTIMEOUTSDWORD ReadIntervalTimeout;DWORD ReadTotalTimeoutMultiplier;DWORD ReadTotalTimeoutconstant;DWORD WriteTotalTimeoutMultiplier;DWORD WriteTotalTimeoutconstant;COMMTIMEOUTS, LPCOMMTIMEOUTS;ReadIntervalTimeout: 以毫秒为单位指定通信线上两个字符到达之间的最大时间。在ReadFile操作其间,收到第一个字符时开始计算时间。若任意两个字符到达之间的间隔超过这个最大值,ReadFile操作完成,返回缓冲数据。0值表示不用间隔限时。若该成员为MAXDWORD,且ReadTotalTimeoutconstant和ReadTotalTimeoutMultiplier成员为零,则指出读操作要立即返回已接收到的字符,即使未收到字符,读操作也要返回。ReadTotalTimeoutMultiplier:以毫秒为单位指定一个乘数,该乘数用来计算读操作的总限时时间。每个读操作的总限时时间等于读操作所需的字节数与该值的乘积。ReadTotalTimeoutConstant:以毫秒为单位指定一个常数,用于计算读操作的总限时时间。每个操作的总限时时间等于ReadTotalTimeoutMultiplier成员乘以读操作所需字节数再加上该值的和。ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant成员的值为0表示读操作不使用限时时间。WriteTotalTimeoutMultiplier和WriteTotalTimeoutconstant的意义和作用分别与ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant相似,不再重复。举例:COMMTIMEOUTS timeouts; timeouts.ReadIntervalTimeout=MAXDWORD; timeouts.ReadTotalTimeoutConstant=0; timeouts.ReadTotalTimeoutMultiplier=0; timeouts.WriteTotalTimeoutConstant=50; timeouts.WriteTotalTimeoutMultiplier=2000; SetCommTimeouts(m_hCom, &timeouts); 这里将ReadIntervalTimeout设置为最大字节数,.ReadTotalTimeoutConstant和ReadTotalTimeoutMultiplier都设置为0,表示不设置读操作超时,也就是说读操作瞬间完成,不进行等待。 调用PurgeComm函数可以终止正在进行的读写操作,该函数还会清除输入或输出缓冲区中的内容。PurgeComm()说明:功能:终止目前正在进行的读或写的动作函数原型:BOOL PurgeComm(HANDLE hFile, / handle of communications resourceDWORD dwFlags / action to perform);参数说明:HANDLE hFile,/串口名称字符串dwFlags 共有四种 flags:PURGE_TXABORT: 终止目前正在进行的(背景)写入动作PURGE_RXABORT: 终正目前正在进行的(背景)读取动作PURGE_TXCLEAR: flush 写入的 bufferPURGE_TXCLEAR: flush 读取的 buffer实例3:/* example3.cpp */* lishaoan 2009-06-29 */* */#include #include #include bool openport(char *portname)/打开串口HANDLE hComm;hComm = CreateFile(portname, /串口号 GENERIC_READ | GENERIC_WRITE, /允许读写 0, /通讯设备必须以独占方式打开 0, /无安全属性 OPEN_EXISTING, /通讯设备已存在 0, /同步I/O 0); /通讯设备不能用模板打开if (hComm = INVALID_HANDLE_VALUE)CloseHandle(hComm);return FALSE;elsereturn true;bool setupdcb(int rate_arg)/设置DCB,先获取DCB配置,再设置,最后看是否设置/好 DCB dcb; int rate= rate_arg; memset(&dcb,0,sizeof(dcb);/在一段内存块中填充某个给定的值,是对较大的结构/体或数组进行清零操作的一种最快方法 if(!GetCommState(hComm,&dcb)/获取当前DCB配置 return FALSE;/ set DCB to configure the serial portdcb.DCBlength = sizeof(dcb);/* - Serial Port Config - */ dcb.BaudRate = rate; dcb.Parity = NOPARITY; dcb.fParity = 0; dcb.StopBits = ONESTOPBIT; dcb.ByteSize = 8; dcb.fOutxCtsFlow = 0; dcb.fOutxDsrFlow = 0; dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fDsrSensitivity = 0; dcb.fRtsControl = RTS_CONTROL_DISABLE; dcb.fOutX = 0; dcb.fInX = 0;/* - misc parameters - */ dcb.fErrorChar = 0; dcb.fBinary = 1; dcb.fNull = 0; dcb.fAbortOnError = 0; dcb.wReserved = 0; dcb.XonLim = 2; dcb.XoffLim = 4; dcb.XonChar = 0x13; dcb.XoffChar = 0x19; dcb.EvtChar = 0; / set DCB if(!SetCommState(hComm,&dcb) return false; else return true;bool setuptimeout(DWORD ReadInterval,DWORD ReadTotalMultiplier,DWORD ReadTotalconstant,DWORD WriteTotalMultiplier,DWORD WriteTotalconstant) COMMTIMEOUTS timeouts; timeouts.ReadIntervalTimeout=ReadInterval; timeouts.ReadTotalTimeoutConstant=ReadTotalconstant; timeouts.ReadTotalTimeoutMultiplier=ReadTotalMultiplier; timeouts.WriteTotalTimeoutConstant=WriteTotalconstant; timeouts.WriteTotalTimeoutMultiplier=WriteTotalMultiplier; if(!SetCommTimeouts(hComm, &timeouts) return false; else return true;void main()bool open;open=openport(com2);if(open)printf(open comport success);if(setupdcb(9600)printf(setupDCB successn);if(setuptimeout(0,0,0,0,0)printf(setuptimeout successn);SetCommMask(hComm, EV_RXCHAR); /当有字符在inbuf中时产生这个事件/清除串口的所有操作PurgeComm(hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);system(pause) ;/* program end*/第四节 读写串口数据及关闭串口Win32API函数ReadFile和WriteFile支持对串行口的读写操作。在调用ReadFile和WriteFile之前,线程应该调用ClearCommError函数清除错误标志。该函数负责报告指定的错误和设备的当前状态。ClearCommError() 用途:清除串口错误或者读取串口现在的状态 原型:BOOL ClearCommError(HANDLE hFile, LPDWORD lpErrors, LPCOMATAT lpStat ); 参数说明: -hFile:串口句柄 -lpErrors:返回错误数值,错误常数如下: 1-CE_BREAK:检测到中断信号。意思是说检测到某个字节数据缺少合法的停止位。 2-CE_FRAME:硬件检测到帧错误。 3-CE_IOE:通信设备发生输入/输出错误。 4-CE_MODE:设置模式错误,或是hFile值错误。 5-CE_OVERRUN:溢出错误,缓冲区容量不足,数据将丢失。 6-CE_RXOVER:溢出错误。 7-CE_RXPARITY:硬件检查到校验位错误。 8-CE_TXFULL:发送缓冲区已满。 -lpStat:指向通信端口状态的结构变量,原型如下: typedef struct _COMSTAT . . DWORD cbInQue; /输入缓冲区中的字节数 DWORD cbOutQue;/输出缓冲区中的字节数 COMSTAT,*LPCOMSTAT; 该结构中对我们很重要的只有上面两个参数,其他的我们可以不用管。假如当前串口中有5个字节数据的话,那么执行完ClearCommError()函数后,ComStat结构中的ComStat.cbInQue将被填充为5,此值在ReadFile函数中可被直接利用。例如:COMSTAT ComStat; DWORD dwError=0; ClearCommError(hComm,&dwError,&ComStat); 上式执行完后,ComStat.cbInQue就是串口中当前含有的数据字节个数,我们利用此 数值就可以用ReadFile()函数去读串口中的数据了。函数ReadFile和WriteFile的行为还受是否使用异步I/O(Overlapped)及通信超时设置的影响。串行口读写的同步、异步方式是在打开端口的同时给dwGlagsAndAttributes参数传入适当的值而设定的。WriteFile() 用途:向串口写数据原型:BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped); 参数说明: -hFile:串口句柄 -lpBuffer:待写入数据的首地址 -nNumberOfBytesToWrite:待写入数据的字节数长度 -lpNumberOfBytesWritten:函数返回的实际写入串口的数据个数的地址,利用此变量可判断实际写入的字节数和准备写入的字节数是否相同。 -lpOverlapped:重叠I/O结构的指针 ReadFile() 用途:读串口数据 原型:BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped); 参数说明: -hFile:串口句柄 -lpBuffer:存储被读出数据的首地址 -nNumberOfBytesToRead:准备读出的字节个数 -NumberOfBytesRead:实际读出的字节个数 -lpOverlapped:异步I/O结构 在同步方式下,调用ReadFile或WriteFile后,当实际读写操作完成或发生超时时才返回调用程序。而异步方式函数在启动接收或发送过程后立即返回,程序继续向下执行,程序在调用ReadFile和WriteFile时必须提供一个Overlapped数据结构指针,该结构中包含一个手动事件同步对象,其后的程序必须借助于该事件同步对象,完成数据的接收和发送过程。通信端口的超时设置对读写的处理方式也会产生影响,如果调用读写函数时发生端口超时,则读写函数立即返回并返回已传输的数据字节数。ReadFile函数只要在串行口输入缓冲区中读入指定数量的字符,就算完成操作。而WriteFile函数不但要把指定数量的字符拷入到输出缓冲中,而且要等这些字符从串行口送出去后才算完成操作。如果不再使用某一端口,须将该端口关闭,以便其他程序可以使用该端口。如果不显式关闭某端口,当程序退出时打开的端口也将被自动关闭。但为了安全起见,最好是显式的关闭它。关闭串口的语句为CloseHandle()。CloseHandle() 用途:关闭串口 原型:BOOL CloseHandle(HANDLE hObjedt) 说明: -hObjedt:串口句柄 操作说明:成功关闭串口时返回true,否则返回false 当ReadFile和WriteFile返回FALSE时,不一定就是操作失败,线程应该调用GetLastError函数分析返回的结果。例如,在重叠操作时如果操作还未完成函数就返回,那么函数就返回FALSE,而且GetLastError函数返回ERROR_IO_PENDING。如果GetLastError函数返回ERROR_IO_PENDING,则说明重叠操作还未完成,线程可以等待操作完成。有两种等待办法:一种办法是用象WaitForSingleObject这样的等待函数来等待OVERLAPPED结构的hEvent成员,可以规定等待的时间,在等待函数返回后,调用GetOverlappedResult。另一种办法是调用GetOverlappedResult函数等待,如果指定该函数的bWait参数为TRUE,那么该函数将等待OVERLAPPED结构的hEvent 事件。GetOverlappedResult可以返回一个OVERLAPPED结构来报告包括实际传输字节在内的重叠操作结果。如果规定了读/写操作的超时,那么当超过规定时间后,hEvent成员会变成有信号的。因此,在超时发生后,WaitForSingleObject和GetOverlappedResult都会结束等待。WaitForSingleObject的dwMilliseconds参数会规定一个等待超时,该函数实际等待的时间是两个超时的最小值。注意GetOverlappedResult不能设置等待的时限,因此如果hEvent成员无信号,则该函数将一直等待下去GetOverlappedResult函数调用方法如下:BOOL GetOverlappedResult(HANDLE hFile, /用CreateFile 获得的文件句柄LPOVERLAPPED lpOverlapped, /指向一个在启动重叠操作时指定的OVERLAPPED结构(即/读写函数中指定的OverLapped结构)LPDWORD lpNumberOfBytesTransferred,/实际传输的字节数BOOL bWait, /是否等待悬挂的重叠操作完成,若为TRUE,则此函数直到操作完成后才/返回。);OVERLAPPED结构定义如下:typedef struct _OVERLAPPED DWORD Internal;DWORD InternalHigh;DWORD Offset;DWORD OffsetHigh;HANDLE hEvent; OVERLAPPED;如果采用异步方式,则在调用ReadFile或WriteFile函数时必需指定一个Overlapped结构,调用后程序可继续执行其它操作,在合适的地方再调用函数GetOverlappedResult判断异步重叠操作是否完成(判断OVERLAPPED结构中的hEvent是否被置位)。WaitCommEvent() 用途:用来判断用SetCommMask()函数设置的串口通信事件是否已发生。 原型:BOOL WaitCommEvent(HANDLE hFile, LPDWORD lpEvtMask, LPOVERLAPPED lpOverlapped ); 参数说明: -hFile:串口句柄 -lpEvtMask:函数执行完后如果检测到串口通信事件的话就将其写入该参数中。 -lpOverlapped:异步结构,用来保存异步操作结果。当由SetCommMask函数所指定的事件产生时这个函数将返回TRUE。注:在用api函数撰写串口通信函数时大体上有两种方法,一种是查寻法,另外一种是事件通知法。这两种方法的区别在于收串口数据时,前一种方法是主动的周期性的查询串口中当前有没有数据;后一种方法是事先设置好需要监视的串口通信事件,然后依靠单独开设的辅助线程进行监视该事件是否已发生,如果没有发生的话该线程就一直不停的等待直到该事件发生后,将该串口事件以消息的方式通知主窗体,然后主窗体收到该消息后依据不同的事件性质进行处理。比如说当主窗体收到监视线程发来的RX_CHAR(串口中有数据)的消息后,就可以用ReadFile() 函数去读串口。实例4:/* example4.cpp */* lishaoan 2009-07-10 */* */#include #include #include HANDLE hComm;OVERLAPPED m_ov;COMSTAT comstat;DWORDm_dwCommEvents;bool openport(char *portname)/打开一个串口hComm = CreateFile(portname, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, /如果在调用CreateFile创建句柄时指/定了FILE_FLAG_OVERLAPPED标志,那么/调用ReadFile和WriteFile对该句柄进/行的操作就应该是重叠的;如果未指定/重叠标志,则读写操作应该是同步的/在同步执行时,函数直到操作完成后才返回。这意味着同步执行时线程会被阻塞,从/而导致效率下降。在重叠执行时,即使操作还未完成,这两个函数也会立即返回,费/时的I/O操作在后台进行 0);if (hComm = INVALID_HANDLE_VALUE)return FALSE;elsereturn true;bool setupdcb(int rate_arg) DCB dcb; int rate= rate_arg; memset(&dcb,0,sizeof(dcb); /在一段内存块中填充某个给定的值,是对较大的结构/体或数组进行清零操作的一种最快方法 if(!GetCommState(hComm,&dcb)/获取当前DCB配置 return FALSE; /* - */ / set DCB to configure the serial port dcb.DCBlen

温馨提示

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

评论

0/150

提交评论