почему стоит открыть порт USB2Serial дороже, чем в первый раз

Я проверяю стоимость времени открытия USB2Serial порт n Centos 7.4. Но я нашел, что это стоило приблизительно 7 мс впервые. Но в следующем открытии это стоило гораздо больше времени. Если я увеличу время сна, запустите снова, это будет стоить больше времени, кроме первого открытия.

я использую usb2serial устройство от FTDI, драйвер ядра — 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

Решение

std::chrono::duration_cast возвращает std::chrono::duration объект.

printf функция старая функция совместимости C, и, как таковая, знает ничего такого о C ++ объектах.

Короче говоря, то, что вы печатаете, в действительности не является продолжительностью, вместо этого у вас есть неопределенное поведение! Учитывая, что вы работаете в Ubuntu, вы используете GCC или Clang, оба компилятора, которые должны жаловаться на это.

Если вы хотите напечатать фактическую длительность «count», используйте 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 ++ правильно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]