Главная страница
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.043 c
14-1095911456
Onix
2004-09-23 07:50
2004.10.10
Наука администрирования


1-1095838030
Clampo
2004-09-22 11:27
2004.10.10
скинка на текст


4-1094549744
Multy
2004-09-07 13:35
2004.10.10
Как просмотреть список запушеных приложений?


14-1095845753
Agent[007]
2004-09-22 13:35
2004.10.10
Паспорт


14-1095933019
Lexxx
2004-09-23 13:50
2004.10.10
Помогите найти компонент.