![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
СОМ-порт, задержка между командами [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]Надо проверить - проверяй.
В чем проблема?