为什么花费比第一次打开USB2Serial端口更长的时间

时间:2018-09-20 12:48:14

标签: c++ centos7 usbserial

我正在测试在Centos 7.4中打开USB2Serial端口的时间成本。但是我发现它第一次花费了大约7毫秒。但这在下一次开放中花费了更多时间。如果增加睡眠时间,请再次运行,除了第一次打开外,它会花费更多时间。

我正在使用FTDI的usb2serial设备,内核驱动程序是ftdi_sio。

这是我的代码:

for (int i = 0; i < 10; i++)
{
    steady_clock::time_point start = steady_clock::now();
    int handle = open("/dev/ttyUSB0", O_RDWR| O_NONBLOCK | O_NDELAY);
    steady_clock::time_point end = steady_clock::now();
    std::cout << "Item " << i <<  ":" << " " << duration_cast<std::chrono::nanoseconds>(end-start).count()/1000000 << " ms" << endl;
    usleep(10000); // us
    close(handle);
}

结果是:

项目0:6毫秒

项目1:76毫秒

项目2:75毫秒

项目3:75毫秒

项目4:75毫秒

项目5:76毫秒

项目6:75毫秒

项目7:75毫秒

项目8:75毫秒

项目9:74毫秒

我只是想知道为什么开放时间在第一次之后就变得更长。关闭前可能需要其他操作。

有人遇到过类似的问题吗?或有何评论?谢谢

1 个答案:

答案 0 :(得分:0)

std::chrono::duration_cast返回一个std::chrono::duration 对象

printf函数是旧的C兼容性函数,因此对C ++对象一无所知。

简而言之,您要打印的不是持续时间,而是undefined behavior!,因为考虑到您使用的是Ubuntu,那么您正在使用GCC或Clang,这两个编译器都应该对此抱怨。

如果要打印实际持续时间“计数”,请使用count成员函数,最好与std::cout一起使用以进行类型安全的转换:

std::cout << "Item " << i << ": " << duration_cast<std::chrono::nanoseconds>(e1-s1).count() << " ns\n";

或者如果您的编译器可以处理即将到来的C ++ 20标准(该标准在持续时间内定义了operator<<重载)中的某些更改,则:

std::cout << "Item " << i << ": " << duration_cast<std::chrono::nanoseconds>(e1-s1) << " ns\n";

重要的一课:不要将C ++和旧的C函数混合使用。它们很少混合得很好。

您可能还想考虑使用getting a few good books来帮助您正确学习C ++。