Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.038 c
3-1094827298
Vasis
2004-09-10 18:41
2004.10.10
Insert, Update, Delete, Refresh SQL


8-1090410569
kingdom
2004-07-21 15:49
2004.10.10
Может ли DirectDraw нарисовать линию?


1-1095964820
lipskiy
2004-09-23 22:40
2004.10.10
Как изменить иконку в ImageList?


6-1091450984
mazepa
2004-08-02 16:49
2004.10.10
лажа с sendtext


14-1095673374
infom
2004-09-20 13:42
2004.10.10
Немодерируемая ветка !!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский