Запись данных последовательного порта 500 Гц или выше - PullRequest
2 голосов
/ 01 декабря 2011

Здравствуйте. Я пытаюсь прочитать некоторые данные с последовательного порта и записать их на жесткий диск. Я использую Visual C ++ Express, и сделал приложение, используя форму Windows.

Программа в основном отправляет байт ("s") каждые t секунды, это запускает устройство, подключенное к последовательному порту, для отправки обратно 3 байтов. Скорость передачи данных сейчас составляет 38400 бит / с. Время t контролируется классом таймера Visual C ++.

Проблема, с которой я столкнулся, заключается в том, что если я установлю время отсчета таймера на 1 мс, данные будут записываться не каждые 1 мс, а примерно каждые 15 мс. Я читал, что, возможно, разрешение таймера установлено на 15 мс, но не уверен в этом. В любом случае, как я могу заставить событие таймера срабатывать каждые 1 мс, а не каждые 15 мс? или есть другой способ читать данные последовательного порта быстрее? Я ищу 500 Гц или выше.

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

Спасибо за любую помощь!

Ответы [ 2 ]

3 голосов
/ 02 декабря 2011

Windows не является операционной системой реального времени, и независимо от того, на какой период установлен ваш таймер, нет никаких гарантий, что он будет постоянно поддерживаться. Кроме того, разрешение часов ОС зависит от реализации HAL поставщика оборудования и варьируется от системы к системе. Мультимедийные таймеры имеют более высокое разрешение, но гарантии в реальном времени по-прежнему отсутствуют.

Кроме того, вам нужно сделать небольшую арифметику относительно времени, которого вы пытаетесь достичь. На 38400, N, 8,1, вы можете перевести не более 3,84 символов за 1 мс, так что в любом случае ваше время ограничено, так как вы пингуете один символ и ожидаете возврата трех символов. Конечно, вы не можете идти быстрее, не увеличивая скорость.

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

В качестве альтернативы вы могли бы просто заставить ваше устройство выполнить свою выборку и передать три символа со временем, полностью определяемым временем передачи трех символов, и постоянно передавать данные. Это даст вам период выборки 781.25us (1280 Гц) без какого-либо запуска с ПК, и он будет действительно периодическим и без дрожания. Если вам нужна более быстрая частота дискретизации, просто увеличьте скорость передачи данных.

1 голос
/ 01 декабря 2011

Разрешение таймера Windows Forms составляет около 15-20 мс. Вы можете попробовать мультимедийный таймер, см. Функцию timeSetEvent.

http://msdn.microsoft.com/en-us/library/windows/desktop/dd757634%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/dd743609%28v=vs.85%29.aspx

Точность таймера задается параметром uResolution (0 - максимально возможная точность). В любом случае вы не можете получить обратный вызов таймера каждую мс - Windows не является системой реального времени.

...