Форум: "WinAPI";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
ВнизСОМ-порт, задержка между командами Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.033 c