2010-03-02 2 views
0

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

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

ответ

1

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

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

+0

переключение задач кажется очевидным, теперь, ты скажи. Что касается UART, я бы ожидал, что ограничения буфера и т. Д. Будут настраиваться, но, возможно, я немного оптимистичен. Похоже, мне нужно делать больше исследований в любом случае. – Niklas

+0

@Niklas - Вы можете установить размер буфера чтения: вот способ .NET: http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readbuffersize.aspx. Конечно, кто знает, действительно ли это работает, или если вы можете передать число, подобное 1. Кроме того, я наткнулся на это ОЧЕНЬ подробное обсуждение слоев обработки событий в классе .NET SerialPort: http://social.msdn.microsoft .com/форум/EN-US/netfxbcl/резьба/e36193cd-a708-42b3-86b7-adff82b19e5e /. Даже если вы не используете .NET, вам может показаться интересным. – mtrw

0

Что вы можете использовать, чтобы получить гораздо более высокое разрешение по времени, это секундомер. Это в System.Diagnostics, а поле Enapsed (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

Смежные вопросы