zoukankan      html  css  js  c++  java
  • COMMTIMEOUTS读写串行口超时

    参考百度百科 COMMTIMEOUTS 

      在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。调用SetCommTimeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。 有两种超时:间隔超时和总超时。间隔超时是指在接收时两个字符之间的最大时延,总超时是指读写操作总共花费的最大时间。写操作只支持总超时,而读操作两种超时均支持。

      用COMMTIMEOUTS结构可以规定读/写操作的超时,该结构的定义为:
    typedef struct _COMMTIMEOUTS {
    DWORD ReadIntervalTimeout; // 读间隔超时
    DWORD ReadTotalTimeoutMultiplier; // 读时间系数
    DWORD ReadTotalTimeoutConstant; // 读时间常量
    DWORD WriteTotalTimeoutMultiplier; // 写时间系数
    DWORD WriteTotalTimeoutConstant; // 写时间常量
    } COMMTIMEOUTS,*LPCOMMTIMEOUTS;
    COMMTIMEOUTS结构的成员都以毫秒为单位。
      ReadIntervalTimeout:两字符之间最大的延时,当读取串口数据时,一旦两个字符传输的时间差超过该时间,读取函数将返回现有的数据。设置为0表示该参数不起作用。指定时间最大值(毫秒),允许接收的2个字节间有时间差。也就 是说,刚接收了一个字节后,等了ReadIntervalTimeout时间后还没有新的字节到达,就 认为本次读串口操作结束(后面的字节等下一次读取操作来处理)。即使你想读8个字节,但读第2个字节后,过了ReadIntervalTimeout时间后,第3个字节还没到。实际上就只读了2个字节。
    ReadTotalTimeoutMultiplier:指定比例因子(毫秒),实际上是设置读取一个字节和等待下一个字节所需的时间,这样总的超时时间为读取的字节数乘以该值,同样一次读取操作到达这个时间后,也认为本次读操作己经结束。
      ReadTotalTimeoutConstant:一次读取串口数据的固定超时。所以在一次读取串口的操作中,其超时为ReadTotalTimeoutMultiplier乘以读取的字节数再加上 ReadTotalTimeoutConstant。将ReadIntervalTimeout设置为MAXDWORD,并将ReadTotalTimeoutMultiplier 和ReadTotalTimeoutConstant设置为0,表示读取操作将立即返回存放在输入缓冲区的字符。可以理解为一个修正时间,实际上就是按ReadTotalTimeoutMultiplier计算出的超时时间再加上该时间才作为整个超时时间。
      WriteTotalTimeoutMultiplier:写入每字符间的超时。
      WriteTotalTimeoutConstant:一次写入串口数据的固定超时。所以在一次写入串口的操作中,其超时为WriteTotalTimeoutMultiplier乘以写入的字节数再加上 WriteTotalTimeoutConstant。
      一般都会做以下设置:
      TimeOuts.ReadIntervalTimeout=MAXDWORD;
      // 把间隔超时设为最大,把总超时设为0将导致ReadFile立即返回并完成操作
      TimeOuts.ReadTotalTimeoutMultiplier=0;
      //读时间系数
      TimeOuts.ReadTotalTimeoutConstant=0;
      //读时间常量
      TimeOuts.WriteTotalTimeoutMultiplier=50;
      //总超时=时间系数*要求读/写的字符数+时间常量
      TimeOuts.WriteTotalTimeoutConstant=2000;
      //设置写超时以指定WriteComm成员函数中的
      总超时的计算公式是:
      总超时=时间系数×要求读/写的字符数 + 时间常量
      例如,如果要读入10个字符,那么读操作的总超时的计算公式为:
      读总超时=ReadTotalTimeoutMultiplier×10 + ReadTotalTimeoutConstant
      可以看出,间隔超时和总超时的设置是不相关的,这可以方便通信程序灵活地设置各种超时。如果所有写超时参数均为0,那么就不使用写超时。如果ReadIntervalTimeout为0,那么就不使用读间隔超时,如果
    ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都为0,则不使用读总超时。如果读间隔超时被设置成MAXDWORD并且两个读总超时为0,那么在读一次输入缓冲区中的内容后读操作就立即完成,而不管是否读入了要求的字符。 在用重叠方式读写串行口时,虽然ReadFile和WriteFile在完成操作以前就可能返回,但超时仍然是起作用的。在这种情况下,超时规定的是操作的完成时间,而不是ReadFile和WriteFile的返回时间。
     
      在使用C#自带的SerialPort类时,未提供字节间隔超时,提供了总超时(ReadTimeOut、WriteTimeOut)。因此自行写了串口类。
  • 相关阅读:
    页面滚屏截图工具推荐
    java总结第二次(剩余内容)//类和对象1
    happy birthday to tbdd tomorrow
    数组增删改查及冒泡
    三个循环方面程序
    三个入门小程序
    java总结第二次//数组及面向对象
    Java总结第一次//有些图片未显示,文章包含基础java语言及各种语句
    后台验证url是不是有效的链接
    img 鼠标滑上后图片放大,滑下后图片复原
  • 原文地址:https://www.cnblogs.com/EasonDongH/p/8574250.html
Copyright © 2011-2022 走看看