Синхронизация последовательного порта Windows? - PullRequest
0 голосов
/ 02 марта 2010

Мне нужно измерить время между символьными событиями на последовательном порту, предпочтительно под Windows 7.
Я читал в разных местах заявления типа « Windows не обеспечит большее разрешение, чем 10 мс» , но мне не удалось выяснить, что означает на самом деле . Проблема в том, что ОС не будет доставлять события с большей точностью, или же функции синхронизации (для измерения) раньше были «плохими»? (Я думаю GetTickCount)

Если последнее, то, я думаю, я смогу использовать что-то вроде QueryPerformanceCounter для достаточно хорошего измерения, но если события не доставляются с одинаковой точностью, это, очевидно, не поможет.

Ответы [ 2 ]

1 голос
/ 02 марта 2010

Я думаю, что время 10 мс связано с переключением задач. Даже если ваше приложение синхронизации является единственной выполняемой пользовательской задачей, все еще есть куча системных задач, которые могут быть включены.

Кроме того, я догадываюсь , что время между получением символа на порту и получением события DataReceived (или любого другого программного уведомления, которое вы хотите) сильно варьируется. Микросхема UART может не прерывать процессор до тех пор, пока он не почувствует себя так (обычно, когда его FIFO заполнен или истекает некоторый тайм-аут), тогда ядро ​​может принять решение, что потребуется некоторое время, прежде чем отправлять эту информацию о прерывании в ваше приложение. Поэтому, даже если вы можете использовать таймер с высоким разрешением в своем программном обеспечении, вы, вероятно, будете зависеть от изменчивости уровня оборудования / ядра.

0 голосов
/ 20 ноября 2015

То, что вы можете использовать для получения более высокого временного разрешения, - это секундомер. Это в System.Diagnostics, и его поле Elapsed (Timespan) имеет разрешение 100 наносекунд (надеюсь, это достаточно точно!) Я использую C ++ Builder и часто вставляю в код что-то вроде этого:

#include <Diagnostics.hpp>

TStopwatch SW;
TTimeSpan TS;
SW = TStopwatch::StartNew();
// Do something we need timed here ...
SW.Stop();
TS = SW.Elapsed;
Caption="That took "+String(TS.Minutes)+" Minutes, "+String(TS.Seconds)+" Seconds."+String(TS.Milliseconds)+" mS.";

Для получения дополнительной информации, вот ссылка на страницу MSDN об этом:

https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch(VS.110).aspx

...