Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

СОМ-порт, задержка между командами   Найти похожие ветки 

 
edthon   (2004-09-06 16:33) [0]

Здравствуйте, такая проблема:
Есть компонент ComPort, работающий с COM-портом, может писать и читать из порта данные. У компонентa есть событие OnRxChar, которое срабатывает, например, когда на команду приходит ответ. Мне нужно послать 3 команды одна за другой, я пишу
ComPortWrite(Cmd1);
//do smth
ComPortWrite(Cmd2);
//do smth
ComPortWrite(Cmd3);
При этом получается так, что все три посылаются почти одновременно, и устройство не реагирует на команды должным образом, а мне нужно после отправки первой команды проверить, сработало ли событие OnRxChar, и потом уже отправлять следующую...
Как можно сделать такую задержку между командами?


 
Reindeer Moss Eater ©   (2004-09-06 16:35) [1]

Надо проверить - проверяй.
В чем проблема?


 
edthon   (2004-09-07 01:29) [2]

Проблема в том, что все три команды уходят одновременно, поэтому вместо
AT+CMGF=0
OK
AT+CMGS=22
>2927926F50008AA080054006500730074
OK
получается
AT+CMGF=0AT+CMGS=222927926F50008AA080054006500730074
ERROR
Как дождаться ответа на одну команду, а потом уже слать следующую?


 
Sergey Kaminski ©   (2004-09-07 02:50) [3]

Хм. Странный вопрос какой-то.

Ну, заверни что-нибудь вроде эдакого.


var
 CanSend: Boolean;
type
 ETimeOut = Exception;
const
 MAX_TIMEOUT = 100000; // ну, сколько надо

.....

procedure Form1.OnRxChar(....);
begin
 CanSend := True;
end;

procedure Form1.SendCommand (ACmd: string);
var
 Cnt: Integer;
begin

 Cnt := 0;
 // вместо этого используй подсчет миллисикунд,
 // чтобы объективно определить тайм-аут
 // ну, то-есть, GetTickCount и т.д.
 // впрочем, для примера сойдет и так
 repeat
   Inc (Cnt);
   Application.ProcessMessages;
 until CanSend or (Cnt>MAX_TIMEOUT);

 if Cnt < MAX_TIMEOUT then
 begin
   ComPortWrite (ACmd)
   CanSend := False
 end
 else
   raise ETimeOut.Create("Time out");
end;

procedure Form1.OnButton1Click (...);
begin
 CanSend := True;
 try
   SendCommand ("bla-bla-1");
   SendCommand ("bla-bla-2");
   SendCommand ("bla-bla-3");
   ....
   ....
 except
   ShowMessage ("Time out error!");
 end;
end;



 
Reindeer Moss Eater ©   (2004-09-07 08:45) [4]

Проблема в том, что все три команды уходят одновременно

А как они должны уходить, если ты их именно так и отправляешь?
Ответов устройства не ждешь, ни на что не реагируешь.
Полный аутизм.


 
Zyb   (2004-09-07 09:28) [5]

edthon, делаешь следующее: посылаешь 1-ю команду, ждешь ответа. Когда пришел ответ, посылаешь вторую команду, ждешь ответа и т.д.


 
edthon   (2004-09-07 13:55) [6]

Всем спасибо! Заработало - вся проблема была в неправильной проверке условия внутри onRxChar, из-за чего событие обрабатывалось неверно :/



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.053 c
14-1095850672
by
2004-09-22 14:57
2004.10.10
Можно ли ориентироваться на постоянные данные?


1-1096053766
fatal
2004-09-24 23:22
2004.10.10
Событие "Скролл колесика мыши" в DBGrid


14-1095429384
Sekr
2004-09-17 17:56
2004.10.10
Как устанавливать компоненты под Delphi7


4-1094562789
VZup
2004-09-07 17:13
2004.10.10
Как рисовать на панели


14-1095777403
}|{yk
2004-09-21 18:36
2004.10.10
Не надо пожалуйста любых обвинений