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

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

СОМ-порт, задержка между командами [D6, WinXP]


edthon ©   (2004-09-06 16:33:00) 

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


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

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


Zyb   (2004-09-07 09:28:00) [2]

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


Reindeer Moss Eater   (2004-09-07 08:45:00) [3]

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

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


Sergey Kaminski   (2004-09-07 02:50:00) [4]

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

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


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;


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

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


Reindeer Moss Eater   (2004-09-06 16:35:00) [6]

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


Наверх

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