Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Запись данных в Com-порт


Автор: mishapk 10.10.2012, 14:56
В 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?

Автор: mishapk 10.10.2012, 17:28
Более менее похожее сделал следующим образом:
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) и даже хуже.

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

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

Для начала переведите свою программу в real time (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686219%28v=vs.85%29.aspx и http://msdn.microsoft.com/en-us/library/windows/desktop/ms686277%28v=vs.85%29.aspx), а потом уже и Sleep и/или multimedia timer

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

Автор: Riviero 11.10.2012, 16:45
А если посылать 50 пакетов, а уже потом ждать до секунды?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)