设为首页 加入收藏

TOP

13.5.2 配置串口(2)
2013-10-07 14:36:36 来源: 作者: 【 】 浏览:54
Tags:13.5.2 配置 串口

13.5.2  配置串口(2)

(2)串口通信超时设置。在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。超时的作用是在指定的时间内没有读入或发送指定数量的字符,ReadFile或WriteFile的操作仍然会结束。

要查询当前的超时设置,应调用GetCommTimeouts()函数,该函数会填充一个COMMTIMEOUTS结构。调用SetCommTimeouts()函数可以用某一个COMMTIMEOUTS结构的内容来设置超时。

读写串口的超时有两种:间隔超时和总超时。间隔超时是指在接收时两个字符之间的最大时延。总超时是指读写操作总共花费的最大时间。写操作只支持总超时,而读操作两种超时均支持。用COMMTIMEOUTS结构可以规定读写操作的超时。COMMTIMEOUTS结构的定义为:

  1. Typedef struct _COMMTIMEOUTS   
  2. {  
  3.     DWORD  ReadIntervalTimeout;             //读间隔超时  
  4.     DWORD  ReadTotalTimeoutMultiplier;      //读时间系数  
  5.     DWORD  ReadTotalTimeoutConstant;        //读时间常量  
  6.     DWORD  WriteTotalTimeoutMultiplier;     //写时间系数  
  7.     DWORD  WriteTotalTimeoutConstant;       //写时间常量  
  8. } COMMTIMEOUTS,*LPCOMMTIMEOUTS; 

COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是:
  1. 总超时=时间系数×要求读/写的字符数+时间常量 

例如,要读入50个字符,那么读操作的总超时的计算公式为:
  1. ReadTotalTimeOut =ReadTotalTimeoutMultiplier×50+ReadTotalTimeoutConstant 

可以看出:间隔超时和总超时的设置是不相关的,这可以方便通信程序灵活地设置各种超时。

如果所有写超时参数均为0,那么就不使用写超时。如果ReadIntervalTimeout为0,那么就不使用读间隔超时。如果ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都为0,则不使用读总超时。如果读间隔超时被设置成MAXDWORD,并且读时间系数和读时间常量都为0,那么在读一次输入缓冲区的内容后读操作就立即返回,而不管是否读入了要求的字符。

注意:在用重叠方式读写串口时,虽然ReadFile和WriteFile在完成操作以前就可能返回,但超时仍然是起作用的。在这种情况下,超时规定的是操作的完成时间,而不是ReadFile和WriteFile的返回时间

(3)申请串口通信缓冲区。除了在DCB中的设置外,程序一般还需要设置I/O缓冲区的大小和超时。Windows用I/O缓冲区来暂存串口输入和输出的数据。如果通信的速率较高,则应该设置较大的缓冲区。调用SetupComm()函数可以设置串行口的输入和输出缓冲区的大小,函数原型如下:

  1. BOOL SetupComm(  
  2.                 HANDLE  hFile,      //通信设备的句柄  
  3.                 DWORD  dwInQueue,   //输入缓冲区的大小(字节数)  
  4.                 DWORD  dwOutQueue   //输出缓冲区的大小(字节数)  
  5.                 ); 

(4)清空串口通信缓冲区。在读写串口之前,还要用PurgeComm()函数清空缓冲区,该函数原型如下:
  1. BOOL PurgeComm(  
  2.                 HANDLE  hFile,      //串口句柄  
  3.                 DWORD  dwFlags  
  4.                 ); 

参数dwFlags指定要完成的操作,可以是表13.5中值的组合。

表13.5  清空缓冲区的值

< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

说    明

P URGE_RXABORT

中断所有读操作并立即返回,即使读操作还没有完成

PURGE_TXABORT

中断所有写操作并立即返回,即使写操作还没有完成

PURGE_TXCLEAR

清除输出缓冲区

PURGE_RXCL EAR

清除输入缓冲区

配置串口属性的示例代码如下:

  1. 01  SetCom(HANDLE hCom)  
  2. 02  {  
  3. 03      SetupComm( hCom, 1024, 1024);       //输入、输出缓冲区的大小都是1024  
  4. 04      COMMTIMEOUTS  TimeOuts;  
  5. 05      //设定读超时  
  6. 06      TimeOuts.ReadIntervalTimeout = 1000;  
  7. 07      TimeOuts.ReadTotalTimeoutMultiplier = 500;  
  8. 08      TimeOuts.ReadTotalTimeoutConstant = 5000;  
  9. 09      //设定写超时  
  10. 10      TimeOuts.WriteTotalTimeoutMultiplier = 500;  
  11. 11      TimeOuts.WriteTotalTimeoutConstant = 2000;  
  12. 12      SetCommTimeouts( hCom, &TimeOuts);      //设置超时  
  13. 13      DCB  dcb;  
  14. 14      GetCommState( hCom, &dcb );  
  15. 15      dcb.BaudRate = CBR_115200;              //波特率为115200  
  16. 16      dcb.ByteSize = 8;                       //每个字节有8位  
  17. 17      dcb.Parity = NOPARITY;                  //无奇偶校验位  
  18. 18      dcb.StopBits = TWOSTOPBITS;             //两个停止位  
  19. 19      SetCommState( hCom, &dcb );  
  20. 20      PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);  
  21. 21  } 


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇13.5.3 读写串口(1) 下一篇13.5.2 配置串口(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: