代码之家  ›  专栏  ›  技术社区  ›  Xiaofeng Victoria Zhislina

读取文件a串行端口设备的不一致延迟

  •  0
  • Xiaofeng Victoria Zhislina  · 技术社区  · 7 年前

    我需要从Windows中的串行端口设备(每秒发送数据)读取数据 REALTIME (<=5毫秒)。但时间成本 ReadFile 是不可预测的,这让我发疯。一些代码可以在以下位置找到: https://gist.github.com/morris-stock/62b1674b4cda0e9df84d4738e54773f8

    延迟转储为 https://gist.github.com/morris-stock/62b1674b4cda0e9df84d4738e54773f8#file-serialport_win-cc-L283

        Poco::Timestamp now;
        if (!ReadFile(_handle, buffer, size, &bytesRead, NULL))
            throw Poco::IOException("failed to read from serial port");
    
        Poco::Timestamp::TimeDiff elapsed = now.elapsed();
        std::cout << Poco::DateTimeFormatter::format(now, "%Y-%m-%d %H:%M:%S.%i")
                  << ", elapsed: " << elapsed << ", data len: " << bytesRead << std::endl << std::flush;
    

    有时 读取文件 成本约3000美元(可以,受以下因素影响 COMMTIMEOUTS )返回,但有时需要花费15600美元(不受 通信超时 ).

    如果我能做些什么来澄清这个问题,请告诉我。

    附笔。

    通信超时 :

    COMMTIMEOUTS cto;
    cto.ReadIntervalTimeout         = 1;
    cto.ReadTotalTimeoutConstant    = 1;
    cto.ReadTotalTimeoutMultiplier  = 0;
    cto.WriteTotalTimeoutConstant   = MAXDWORD;
    cto.WriteTotalTimeoutMultiplier = 0;
    

    主读线程部分:

    https://gist.github.com/morris-stock/62b1674b4cda0e9df84d4738e54773f8#file-serialdevice-cc-L31

    设备数据类型

    波特率 :9600,它每秒发送大约400字节(连续发送,然后在第二秒的剩余时间内没有数据)。

    consle输出

          wPacketLength: 64
         wPacketVersion: 2
          dwServiceMask: 1
            dwReserved1: 0
           dwMaxTxQueue: 0
           dwMaxRxQueue: 0
              dwMaxBaud: 268435456
          dwProvSubType: 1
     dwProvCapabilities: 255
       dwSettableParams: 127
         dwSettableBaud: 268959743
          wSettableData: 15
    wSettableStopParity: 7943
       dwCurrentTxQueue: 0
       dwCurrentRxQueue: 68824
            dwProvSpec1: 0
            dwProvSpec2: 1128813859
             wcProvChar: 0039F16C
    2018-01-22 03:35:52.658, elapsed: 15600, data len: 0
    2018-01-22 03:35:52.673, elapsed: 15600, data len: 0
    2018-01-22 03:35:52.689, elapsed: 15600, data len: 0
    2018-01-22 03:35:52.704, elapsed: 15600, data len: 0
    2018-01-22 03:35:52.720, elapsed: 15600, data len: 0
    2018-01-22 03:35:52.736, elapsed: 15600, data len: 0
    2018-01-22 03:35:52.751, elapsed: 15600, data len: 0
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Xiaofeng Victoria Zhislina    7 年前

    在我的情况下 Windows system clock resolution 这很重要。

    ClockRes 给我:

    C:\work\utils\ClockRes>Clockres.exe
    
    Clockres v2.1 - Clock resolution display utility
    Copyright (C) 2016 Mark Russinovich
    Sysinternals
    
    Maximum timer interval: 15.600 ms
    Minimum timer interval: 0.500 ms
    Current timer interval: 1.000 ms
    

    C:\work\utils\ClockRes>Clockres.exe
    
    Clockres v2.1 - Clock resolution display utility
    Copyright (C) 2016 Mark Russinovich
    Sysinternals
    
    Maximum timer interval: 15.600 ms
    Minimum timer interval: 0.500 ms
    Current timer interval: 15.600 ms
    

    通过调用 timeBeginPeriod (1) 当我的应用程序启动时,我可以得到更一致的结果。

    谢谢大家的帮助。