基于vc的串行通信技术应用实例.docx

基于VC的串行通信技术应用实例 作者:出处:论坛责任编辑: 方舟[2003-10-13 18:04 ] 本文将介绍在 Windows平台下串行通信的工作机制和用 VC设计串行通信程序的 编程方法 串行通信的操作方式 下面我们将介绍串行通信的几种操作方式: 同步方式 同步方式中,读串口的函数试图在串口的接收缓冲区中读取规定数目的 数 据,直到规定数目的 数据全部被读出或设定的超时时间已到时才返回。例如 : COMMTIMEOUTS timeOver; memset(timeOver,0,sizeof(timeOver)); DWORD timeMultiplier,timeCo nsta nt; timeOver.ReadTotalTimeoutMultiplier=timeMultiplier; timeOver.ReadTotalTimeoutC on sta nt=timeC on sta nt; SetCommTimeouts(hComport,timeOver); ReadFile(hComport,i nBuffer, nWan tRead,n RealRead,NULL); COMMTIMEOUT构用于设置读写函数的等待时间。 在ReadFile函数中hComport为待读串口句柄;in Buffer 为输入缓冲区大 小;nWantReac为每次调用 ReadFile时,函数试图读出的字节数;nRealRead 为实际读出的字节数;最后一个参数值NULL代表ReadFile将采用同步文件读写 的方式。 如果所规定的待读取 数据的数目nWantRead较大且设定的超时时间也较长, 而接收缓冲区中数据较少,则可能引起线程阻塞。解决这一问题的方法是检查 COMSTAR构的cblnQue成员,该成员的大小即为接收缓冲区中处于等待状态的 数据的实际个数。如果令nWantRead的值等于COMSTAT.cblnQue就能较好地防 止线程阻塞。 查询方式 查询方式,即一个进程中的某一线程定时地查询 串口的接收缓冲区,如果缓 冲区中有数据,就读取数据;若缓冲区中没有数据,该线程将继续执行,因此会 占用大量的CPU时间,它实际上是同步方式的一种派生。例如: COMMTIMEOUTS timeOver; memset(timeOver,0,sizeof(timeOver)); timeOver.Readl ntervalTimeout=MAXWORD; SetCommTimeouts(hComport .timeOver); ReadFile(hComport.i nBuffer. nWan tRead.n RealRead,NULL); 除了 COMMTIMEOU结构的变量timeOver设置不同外,查询方式与同步方式 在程序代码方面很类似,但二者的工作方式却差别很大。尽管 ReadFile采用的 也是同步文件读写方式,但由于timeOver的区间超过时间设置为 MAXWOR所 以ReadFile每次将读出接收队列中的所有处于等待状态的 数据,一次最多可读 出nWantReac个字节的数据。 异步方式 异步方式中,利用Windows的多线程结构,可以让串口的读写操作在后台进 行,而应用程序的其他部分在前台执行。例如: OVERLAPPED wrOverlapped; COMMTIMEOUTS timeOver; memset(timeOver.O.sizeof(timeOver)); DWORDtimeMultiplier,timeCo nsta nt; timeOver.ReadTotalTimeoutMultiplier=timeMultiplier; timeOver.ReadTotalTimeoutC on sta nt=timeC on sta nt; SetCommTimeouts(hComport,timeOver); wrOverlapped.hEve nt=CreateEve nt(NULL.TRUE,FALSE,NULL); ReadFile(hComport,i nBuffer, nWan tRead,n RealRead,wrOverlapped); GetOverlappedResult(hComport,wrOverlapped, n RealRead,TRUE); ResetEve nt(wrOverlapped.hEve nt); 上面代码中的ReadFile由于采用了异步方式,所以它只返回 数据是否已开 始读入的状态,并不返回实际的读入 数据,即ReadFile中的nRealRead无效。 实际读入的数据是由GetOverlappedResult函数返回的,该函数的最后一个参数 值为TRUE表示它等

文档评论(0)

1亿VIP精品文档

相关文档