Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2014, 09:47   #1
poligon
 
Регистрация: 28.10.2014
Сообщений: 6
Вопрос Диагностика авто. Задержка 25 мс на TX линию COM порта.

Здравствуйте. Необходимо подать импульс длиной 25 мс на передающую линию COM порта с точностью +/- 1 мс. После этого отправить в порт данные.

Для работы с COM портом использую компонент AsyncFree:
Код:
AfComPort1.Open;

timeBeginPeriod(1);  // повышаем точность таймера

SetCommBreak(AfComPort1.Handle);  // опускаем линию в 0
Sleep(25);  // ждем

ClearCommBreak(AfComPort1.Handle);  // поднимаем линию в 1
Sleep(25); // ждем

timeEndPeriod(1);

AfComPort1.PurgeRX;   // чистим входной буффер на всякий случай
AfComPort1.WriteData(StartCommunication, length(StartCommunication));  // отправляем запрос
В итоге смотрю логическим анализатором состояние линии - 0 держится ~ 15 мс, 1 держится ~ 26 мс. Что естественно не укладывается в допуск.

Пробую по другому:
Код:
var
  hTim: THandle;
  DueTime: Int64;
begin
  AfComPort1.Open;

  hTim:= CreateWaitableTimer(nil,false,nil);
  DueTime:= -250000;  // 250000 раз по 100 нс

  SetCommBreak(AfComPort1.Handle);
  SetWaitableTimer(hTim,DueTime,0,nil,nil,false);
  WaitForSingleObjectEx(hTim,infinite,true);

  ClearCommBreak(AfComPort1.Handle);
  SetWaitableTimer(hTim,DueTime,0,nil,nil,false);
  WaitForSingleObjectEx(hTim,infinite,true);

  AfComPort1.WriteData(StartCommunication, length(StartCommunication));
0 держится ~ 22 мс, 1 держится ~ 30 мс

Пробовал повышать приоритет процесса. Не помогает. Запустил одну из программ диагностики, написанную на Delphi, она дает на линию импульс ~ 25 мс и укладывается в допуск. Как они это сделали??
Изображения
Тип файла: jpg Start.jpg (19.4 Кб, 118 просмотров)
Тип файла: jpg SetWaitableTimer.jpg (23.0 Кб, 119 просмотров)
Тип файла: jpg timeBeginPeriod.jpg (23.1 Кб, 139 просмотров)
poligon вне форума Ответить с цитированием
Старый 28.10.2014, 10:28   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Я написал (на основе чужих изысканий, признаюсь честно) чудесный класс - высокоточный таймер. Сам я работаю на военном заводе, тут народ тоже мучался, нужна была им задержка в несколько миллисекунд, никак они её не могли добиться, т.к. стандартные виндовые Sleep() и GetTickCount() на малых интервалах дают просто чудовищную погрешность - до 1600% (!!!). Погрешность получившегося таймера я особо не мерял, но людей устроило и устраивает до сих пор, никто не жаловался. Более того, говорят, что у них отлично получается отмерять и микросекунды.

Короче, могу подарить исходник (delphi и С++) с демо-примерами впридачу.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 28.10.2014, 10:57   #3
poligon
 
Регистрация: 28.10.2014
Сообщений: 6
Хорошо

С удовольствием приму в дар
poligon вне форума Ответить с цитированием
Старый 28.10.2014, 11:04   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от poligon Посмотреть сообщение
С удовольствием приму в дар
Да пожалуйста.
Просьба: о результатах напиши сюда, мне интересно. И приложи характеристики процессора, на котором тестировал.
Вложения
Тип файла: rar Измерение времени (pascal).rar (176.8 Кб, 30 просмотров)
Тип файла: rar Измерение времени (C++).rar (256.5 Кб, 12 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 28.10.2014, 11:12   #5
poligon
 
Регистрация: 28.10.2014
Сообщений: 6
По умолчанию

Спасибо. Сейчас протестирую
poligon вне форума Ответить с цитированием
Старый 28.10.2014, 11:46   #6
poligon
 
Регистрация: 28.10.2014
Сообщений: 6
Вопрос

26 мс и 27 мс вместо 25 мс через функцию HRDelay.

Старенький ноутбук с процессором пентиум 4, 3.2 ГГц, система ХР. Смысл такой: настраиваю стандартный компонент Тimer чтобы он срабатывал с интервалом 500 мс. И в зависимости от режима в котором находимся либо дергаем линию и отправляем запрос, либо просто шлем запрос. Может такое быть из за того что я вызываю задержку в цикле обычного таймера? Или сам компонент для COM порта чудит?

Код:
var
  Mode: integer =0;
  {
   0 - коннект
   1 - запрос параметров 1
   2 - запрос параметров 2
   3 - запрос параметров 3
  }

...

procedure TForm1.N2Click(Sender: TObject);
begin
AfComPort1.Open;
StatusBar1.Panels.Items[0].Text:='Подключение...';
Timer1.Enabled:= true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  case mode of
  0: begin    // если в режиме подключения
     Timer1.Interval:=500;
     // Дергаем линию

     SetCommBreak(AfComPort1.Handle);
     HRDelay(25.0);
     ClearCommBreak(AfComPort1.Handle);
     HRDelay(25.0);

     AfComPort1.PurgeRX;
     CurrentPos:=0;
     AfComPort1.WriteData(StartCommunication, length(StartCommunication));
  end;
  1: begin   // если в режиме запроса параметров
     Timer1.Interval:=250;
     CurrentPos:=0;
     AfComPort1.WriteData(ReadData, length(ReadData));
  end;
  end;
end;
Изображения
Тип файла: jpg HR.jpg (23.4 Кб, 113 просмотров)
poligon вне форума Ответить с цитированием
Старый 28.10.2014, 11:58   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
И в зависимости от режима в котором находимся либо дергаем линию и отправляем запрос, либо просто шлем запрос. Может такое быть из за того что я вызываю задержку в цикле обычного таймера? Или сам компонент для COM порта чудит?
Да я хз, подёргай демо для С++, скриншотов понаделай на малых интервалах и покажи. Будем подумать. В любом случае, более точных способов измерения времени под windows я не знаю.
Функции работы с СОМ-портом тоже время занимают, так что можно, в принципе, и подогнать параметр для HRDelay().

upd: а ты померяй, кстати, методами THRTimer времена исполнения функций работы с портом!

З.Ы. HRDelay() - это таки функция, ты посмотри, что она в результате выдаёт, на всякий случай.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 28.10.2014 в 12:10.
min@y™ вне форума Ответить с цитированием
Старый 28.10.2014, 12:28   #8
poligon
 
Регистрация: 28.10.2014
Сообщений: 6
Вопрос

Сделал чередование задержек. Попробую на машине, подключится или нет. Функция THRTimer выдает дробные значения задержки.

Код:
case mode of
  0: begin
     Timer1.Interval:=500;
     // Дергаем линию
     case Conn of
     0: begin
        SetCommBreak(AfComPort1.Handle);
        HRDelay(25.0); 
        ClearCommBreak(AfComPort1.Handle); 
        HRDelay(24.0); 
        Conn:=1;
        end;
     1: begin
        SetCommBreak(AfComPort1.Handle); 
        HRDelay(24.0); 
        ClearCommBreak(AfComPort1.Handle); 
        HRDelay(23.0); 
        Conn:=0;
        end;
     end;
Изображения
Тип файла: png Delay.PNG (9.6 Кб, 67 просмотров)
Тип файла: png Get.PNG (9.6 Кб, 73 просмотров)
Тип файла: png HR.PNG (9.5 Кб, 65 просмотров)
Тип файла: png Sleep.PNG (9.5 Кб, 67 просмотров)

Последний раз редактировалось poligon; 28.10.2014 в 12:32.
poligon вне форума Ответить с цитированием
Старый 28.10.2014, 12:36   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Функция THRTimer выдает дробные значения задержки.
Правильно, оно ж Double-типа.
Какие значения-то? Составь небольшую таблицу эксперимента в 2 столбца: "на входе функции", "на выходе функции". Во 2-й столбец пиши значения с точностью до 3-4 знаков после точки. Попробуем выявить математический закон изменения погрешности эмпирическим методом.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 28.10.2014, 12:42   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

ты померяй методами THRTimer времена исполнения функций работы с портом.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
диагностика сетевых интерфейсов. Ol'ga Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 1 05.06.2014 12:13
Авто-копирование строки вниз при заполнении текущей (или авто-отображение скрытой ниже) bygaga Microsoft Office Excel 6 25.11.2011 14:46
Диагностика компьютеров yojeen Софт 5 31.12.2010 07:37
Диагностика нерабочего железа ssdm Компьютерное железо 2 01.12.2010 15:19
Как получить данные с COM-порта или другого любого порта? DeLure Общие вопросы C/C++ 5 20.09.2007 00:50