Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы с портом


Страницы:   1 2

Замученный ©   (2003-07-15 14:57:00) 

Уважаемые граждане, помогите пожалуйста.

Имеется прибор, подключенный к com порту. Прибору посылаются различные команды, он на них реагирует и посылает в ответ определенную информацию.

Проблема в следующем. При посылке ему какой-то команды, перед ответом возникает определенная задержка, которой в принципе быть не должно (смотрел по осциллографу). Задержка где-то около 46 мсек. Это мешает работать.

В работе использовал различные компоненты для работы с портом. Везде тот же результат.
Что можно сделать??? Заранее благодарен.


pasha676   (2003-07-17 15:43:00) [21]

так время замерять не совсем коректно. Особенно в виндах.
Где по твоей проге тратиться время?
Ты перед отправлением запоминаешь время. Символы бегут в компорт, оттуда в девай, девайс думает, девайс отвечает, символы ответа приходят в ком порт, генериться сообщение, сообщение генерит эвент ComPort1RxChar, тут ты опять запоминаешь время. Тебе не кажеться что ты меряешь время всего цикла?


С момента прихода символа, до вваливания в обработку ComPort - вот время задержки виндоуз. Где оно у тебя считается? И я не знаю.


Замученный   (2003-07-17 15:30:00) [22]

Приведу кусок кода, может поможет

Procedure TForm1.Tik;
Begin

ComPort1.Open; // Открываю порт

// Подготавливаю данные для отправки
dim_send[0]:= ord(chr(StrToInt("1")));
dim_send[1]:= ord(chr(StrToInt("$90")));
dim_send[2]:= ord(chr(StrToInt("0")));

// Отправляю 3 байта в порт
ComPort1.Write(dim_send,3);
End;

procedure TForm1.Button1Click(Sender: TObject);
Var
i,k:integer;
begin
// Щелкаем на кнопке, оправляем данные в порт и замеряем время
Tik;
Time1:=Time;
end;

// В порт что-то пришло, принимаем

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var i,p:byte;
begin
// Измеряем время и декодируем его. Далее находим MSec2-MSec1
Time2:=Time;
DecodeTime(Time1,Hour1,Min1,Sec1,MSec1);
DecodeTime(Time2,Hour2,Min2,Sec2,MSec2);

// Принимаем данные
ComPort1.ReadStr(Answer,3);
end;

В итоге MSec2-MSec1 = 46


Лёша   (2003-07-17 14:53:00) [23]

Так я и не понял где задержка...

| | | ( RS232)

Так я и не понял где задержка...

| | | |
| [ПО] <-> [порт] <---> (RS232) <-> [порт] <-> [ПО] |
| | | | | | |
| | |
| |__________________ |
| _________T1_______||
| |
|______________________________ |
___________T2_________________|

Почувствуй разницу и проверь еще раз значение своей задержки!
1.
>Verg Задержка возникает между тем как была послана команда
>устройству и получен ответ в приложении. Задержку мерял сл.
>образом. Измерял время, после отправки и перед приемом,
>затем находил разницу.
T2
2. Т1
3. другие варианты


Замученный   (2003-07-17 14:05:00) [24]

Пробовал

ReadInterval := 100;
ReadTotalConstant := 100;
ReadTotalMultiplier := 100;
WriteTotalConstant := 100;
WriteTotalMultiplier:= 100;

После первого запуска 37 мс, а затем опять 46 мс. Что за чертовщина??? Может во всем виноват XP?


Замученный   (2003-07-17 13:35:00) [25]

Verg Задержка возникает между тем как была послана команда устройству и получен ответ в приложении. Задержку мерял сл. образом. Измерял время, после отправки и перед приемом, затем находил разницу.

Что касается скорости то она 2400 bps. Посылка 8 байт, 2 стопа.

Попробую сейчас покапаться в MSDN "Serial Communications Functions", может что и поможет. Если у кого есть код, буду рад принять.


pasha676   (2003-07-17 09:06:00) [26]


> WIN32 API - четко, быстро, без глюков и отладить легко

Помоему это тоже выход. Во всяком случае контроля больше. Ведь не известно что там в компоненте понаписано.


Лёша   (2003-07-16 20:31:00) [27]

Попробуй:
ReadInterval := 100;
ReadTotalConstant ( см. MSDN "Serial Communications Functions")

Попробуй:
ReadInterval := 100;
ReadTotalConstant := 100;
ReadTotalMultiplier := 100;
WriteTotalConstant := 100;
WriteTotalMultiplier:= 100;

когда присвоены значения "0" - таймауты не используютсья вообще. Кто знает, как работает твоя компонента, может это его сбивает. А лучше перепеши на WIN32 API - четко, быстро, без глюков и отладить легко. (см. MSDN "Serial Communications Functions")


jack128   (2003-07-16 19:44:00) [28]

Мне тоже интресно как можно замерить такую задержку...
И кстати укажи скорость и размер посылки от устройства, а то если скорость 300 bps и посылка в 10 байт, то около 30 мс и выходит ;-)


Verg   (2003-07-16 17:40:00) [29]

Win32 - это не система реального времени и требовать какого-либо времени реакции приложения на событие нельзя.
Это в общем.
А потом, уточни все же между чем и чем задержка? Между тем как пролетел байт (по осцилу) и он "упал" в апликуху? Как ты мерял эту задержку?


Замученный   (2003-07-16 16:59:00) [30]

Так откуда берется задержка, может быть это проблемы с системой и так должно быть


pasha676   (2003-07-16 16:52:00) [31]

Если используешь компоненты, то надо рыться в них. Подсказать может только тот кто с этими компонентами работал и подобной проблеммой сталкивался.


Замученный   (2003-07-16 15:24:00) [32]

Устройство, которое рассматривается, позволяет мерять различные характеристики жидкости. Для этого применяется ряд коэффициентов. Данные коэффициенты в процессе работы сбиваются, в результате чего приходится их перепрограммировать. После записи каждого коэфф. устройство сообщает, что процесс записи коэфф. закончился удачно и ждет след., если он не приходит (в течение 10 мс.)выскакивает ошибка и процесс записи прекращается. В результате я могу лишь записать первый коэффициент, что у меня и получается.

Проверил PortMonitor"ом, обмен данными имеет место.
Что касается таймаутов то они такие (использую свойство TimeOuts компонента ComPort Library):
ReadInterval = 0;
ReadTotalConstant = 0;
ReadTotalMultiplier = 0;
WriteTotalConstant = 0;
WriteTotalMultiplier = 0;


Лёша   (2003-07-16 14:00:00) [33]

То, что ты проверил на осциле, ничего не значит. Проверь PortMonitor"ом или другой гляделкой порта. Если убедишься, что обмен данными имеет место и данные корректны, проверь/настрой таймауты порта: COMMTIMEOUTS (GetCommTimeouts/SetCommTimeouts). Если не поможет, сообщи, будем копать дальше.


pasha676   (2003-07-16 12:54:00) [34]

Что задержка будет это понятно (правда должна быть махонькая, в пределах 2-3 мс а то и меньше). Непонятно чем она тебе мешает. Кстати как общаешься с устройством? Может задержка в коде.


Замученный   (2003-07-16 11:26:00) [35]

Задержка между запросом и ответом.

Так устройство отвечает сразу же после посланной ему команды. Проверял на осциллографе.

Может вставку на асме сделать? Может поможет? Если кто код знает, помогите please, а то горю совсем. Буду благодарен за любую инфу


jack128   (2003-07-16 11:02:00) [36]

Замученный © (15.07.03 14:57) В смысле задержка? Между запросом и ответом? и правильно, Ведь должно твое устройство подумать, что ответить..


Лёша   (2003-07-15 17:48:00) [37]

Задержка - понятие растяжимое!
Где задержка?


Замученный   (2003-07-15 15:45:00) [38]

А что же делать с задержкой??? и где найти это модуль???


Kostya   (2003-07-15 15:37:00) [39]

Есть в инете модуль sadirectport -отличная вещь
нет проблем


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо