Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись данных в Com-порт, Точность задержки 
:(
    Опции темы
mishapk
  Дата 10.10.2012, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 26.1.2012

Репутация: нет
Всего: нет



В Com-порт при помощи буфера размером 320 байт записываются данные в цикле.

Код

while(!feof(fin))
{
 Sleep(16);
fread(&a,sizeof(a),1,fin);
WriteFile(hComm1,&a,320,&dwBytesWrite,NULL);
}
fclose(fin); */


Необходимо чтобы за одну секунду происходило ровно 50 записей в порт.
Но при изменении значения Sleep(x) получаем следующие значения:
 x=16 -> 31(зап.в сек)
 x=15 -> 73 (зап.в сек)

Подскажите как добиться 50 записей в секунду?
Или настройки порта или Более точный Sleep?

PM MAIL   Вверх
mishapk
Дата 10.10.2012, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 26.1.2012

Репутация: нет
Всего: нет



Более менее похожее сделал следующим образом:
1. Создал переменную и функцию
Код

bool delay;
void CALLBACK TimerFunction1(UINT wTimerID, UINT msg,
    DWORD dwUser, DWORD dw1, DWORD dw2)
{
 if (delay) delay=false; else delay=true;
}

2. Добавил в цикл - цикл паузы c минимальным Sleep(1) без него идет загрузка ядра процессора до 15%
Код

while(!feof(fin))
{
fread(&a,sizeof(a),1,fin);
WriteFile(hComm1,&a,320,&dwBytesWrite,NULL);
   while(delay) // цикл-пауза
  {
     Sleep(1);
  }
  delay=true;
}
fclose(fin); 


3.  И самое главное запустил мультимедийный таймер перед началом работы цикла.
Код

timeSetEvent(20,0,TimerFunction1 ,0,TIME_PERIODIC);


P.S. Пробовал обычный таймер тоже ведет себя не предсказуемо как и простой Sleep(15-16) и даже хуже.
PM MAIL   Вверх
xvr
Дата 11.10.2012, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(mishapk @  10.10.2012,  14:56 Найти цитируемый пост)
Подскажите как добиться 50 записей в секунду?

Windows не Real Time система. Т.е. она вполне может усыпить вашу программу на пару секунд, если у нее случится что то свое, более важное  smile 
Можно только более или менее приблизится к заветным 50ти записям в порт в секунду, но будьте готовы к тому, что периодически могут возникать 'выбросы'.

Для начала переведите свою программу в real time (SetPriorityClass и SetThreadPriority), а потом уже и Sleep и/или multimedia timer

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

PM MAIL   Вверх
Riviero
Дата 11.10.2012, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 2
Всего: 3



А если посылать 50 пакетов, а уже потом ждать до секунды?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.