首页 > 解决方案 > 为什么打开USB2Serial端口比第一次花费更长的时间

问题描述

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

我正在使用usb2serialFTDI 的设备,内核驱动程序是 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 毫秒

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

有人遇到过类似的问题吗?或者有什么意见?谢谢

标签: c++centos7usbserial

解决方案


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

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

简而言之,您要打印的并不是真正的持续时间,而是您有未定义的行为!考虑到您使用的是 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 函数。它们很少混合得很好。

您可能还想考虑购买一些好书来帮助您正确学习 C++。


推荐阅读