Проблема с высокоскоростным считыванием данных методом Settimer - PullRequest
0 голосов
/ 13 июля 2011

Я использую оборудование с чипом ftdi в режиме FIFO и драйвер D2xx для своей работы. Аппаратное обеспечение отправляет байты данных с частотой от 19,5 кГц до 312,5 кГц для различных настроек. Поэтому мое прикладное программное обеспечение (MFC C ++) должно считывать эти байты, поступающие с разной скоростью. Я использую метод Settimer и Ontimer со значением 10 мс. Поэтому каждые 10 мс я читаю байты данных и выполняю некоторую обработку в функции OnTimer. Мои вопросы

1> с помощью метода settimer разные системы дают разные результаты, хотя обе системы являются XP SP3. Одна система считывает все байты без каких-либо пропусков, но в другой системе данные будут отсутствовать. Так зависит ли этот таймер от ОС или аппаратного обеспечения системы?

2> Из того, что я понимаю, минимальное значение, которое я могу установить для settimer, составляет 10 мс. Так что каждые 10 мс я могу читать данные. Если я не читаю быстро, в буфере драйвера будет переполнение, которое я не могу контролировать. читать быстрее в микросекундах или нано секундах с помощью любого метода таймера или есть какой-либо другой метод? Пожалуйста, предложите мне идею ... Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 13 июля 2011

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

Во-первых, вы зависите от разрешения таймера системы, которое обычно составляет 15 мс.Таким образом, даже если вы установите 10 мс, он будет равняться 15 мс (или больше).

Во-вторых, уведомления по таймеру отправляются, когда больше нет сообщений для обработки.Таким образом, в цикле сообщений, когда в очереди больше нет сообщений, система проверяет, установлен ли какой-либо таймер и установлен ли он.Если это так, он отправляет одно уведомление.Дело в том, что если ваша программа занята другими делами, она может потерять один или несколько «тиков» и «сгруппировать» их в одном уведомлении, что может произойти, скажем, за 75 мс.

Нижняя строкаSetTimer не является надежным методом таймера для нужд высокого разрешения.

Так что вам, возможно, придется посмотреть на другие решения, например, на отдельную ветку для чтения.

0 голосов
/ 13 июля 2011

Возможно, будет более надежно хранить блокировку на Read() в отдельном потоке.

SetTimer() предназначена только для работы с низким разрешением.Его разрешение может быть уменьшено в зависимости от настроек электропитания в более поздних версиях Windows.

Если вам нужны таймеры с высоким разрешением, Очереди таймеров или Таймеры мультимедиа (в частности, timeSetEvent()) - это путь, который может иметь разрешение до 1 мс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...