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

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

чтение из COM-порта - загадочное поведение программы [D5]


RWolf ©   (2009-06-15 15:51:00) 

Обнаружился тут занятный полтергейст с Д5.
Кладу на форму три кнопки. Первая отправляет команду в COM-порт и слушает приходящие символы:
   hPort:THandle;
   cancelled:BOOL;

procedure TForm1.Button1Click(Sender: TObject);
const READ_ONCE=16;
var rxbuf:array[0..READ_ONCE-1]of Byte;
   cmd:string;i,n:dword;
begin
 EscapeCommFunction(hPort,SETDTR);
 EscapeCommFunction(hPort,SETRTS);
 //ждём установки CTS
 repeat
   Application.ProcessMessages;
 until GetCTS;
 Memo1.Lines.Add('CTS=1');
 //посылаем команду
 cmd:='U '#0#0#0#0#0'C';
 WriteFile(hPort,cmd[1],Length(cmd),n,nil);
 sleep(10);
 EscapeCommFunction(hPort,CLRRTS);
 while not cancelled do begin
   ReadFile(hPort,rxbuf[0],READ_ONCE,n,nil);
   if n<>0 then begin
     for i:=0 to n-1 do begin
       Memo1.Lines.Add(format('%x',[rxbuf[i]])); //показываем пришедший символ
     end;
   end;
   Application.ProcessMessages;
 end;
 cancelled:=False;
 EscapeCommFunction(hPort,CLRDTR);
end;


Вторая завершает прослушивание:
procedure TForm1.Button2Click(Sender: TObject);
begin
 cancelled:=True;
end;


Третья, самая интересная, содержит закомментированную строчку:
procedure TForm1.Button3Click(Sender: TObject);
begin
//inttohex(2,2);
end;


Пока строчка закомментирована, всё работает, как задумано: нажатие Button1 отсылает команду, приходят символы, выводятся в мемо, нажатие Button2 завершает прослушивание. Если строчку раскомментировать, приём символов прекращается. Button3 при этом нажимать необязательно,
inttohex может использоваться в любом контексте, с любыми аргументами и т.п.
Есть предположения, что бы это могло быть?


Сергей М.   (2009-06-15 18:19:00) [1]


> Собственно, это я и делаю


Чего делаешь-то ?

Судя по коду как раз не делаешь самого главного - не анализируешь результат вызова ReadFile, равно, впрочем, как и WriteFile.

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

Еще раз : еслирежим блокирующий иф-ция ReadFile, вызванная для чтения N байт вернула True, тоэто говорит только об одном - запрошенные к чтению N байт успешнопрочитаны.


RWolf   (2009-06-15 17:11:00) [2]

Собственно, это я и делаю. Только строчка вот непонятно каким образом влияет на процесс.
Что характерно, сменить её хотя бы на inttostr - и приём снова работает :/


Сергей М.   (2009-06-15 17:09:00) [3]


> "входящие" данные - это реакция на команду


Это и ежу понятно.


> раз я наблюдаю активность на Rx - значит, команда была передана
> успешно


Для этого вовсе не обязателен осциллограф - достаточно того же отладчика.
И если ты наблюдаешь активность на Rx, то осталось только получить принятые данные блокирующим вызовом ReadFile, вернувшим управление с результятом True


RWolf   (2009-06-15 17:03:00) [4]

тут дело в том, что "входящие" данные - это реакция на команду, и раз я наблюдаю активность на Rx - значит, команда была передана успешно.


Сергей М.   (2009-06-15 17:01:00) [5]


> на RxD данные есть в обоих случаях

но

> Отладчик говорит, что никаких символов ReadFile не принимает


?

Если при этом режим блокирующий и ReadFile вернула True, то точно чудеса в решете)


Сергей М.   (2009-06-15 16:57:00) [6]


> смотрю сигнал прямо на RS-232 осциллографом


Ну ты и кулибин)

Т.е. для проверки успешности вызова ReadFile отладчик, значит, годится, а для проверки той же самой успешности вызова WriteFile отладчик уже совсем не пригоден и надо городить огород с осциллографом ?


RWolf   (2009-06-15 16:53:00) [7]


> Что говорит отладчик по поводу успешности записи команды в порт

Я смотрю сигнал прямо на RS-232 осциллографом. И на TxD, и на RxD данные есть в обоих случаях.


Сергей М.   (2009-06-15 16:37:00) [8]


> Отладчик говорит, что никаких символов ReadFile не принимает


Чтобы она что-то принимала, надо, очевидно, чтобы WriteFile успешно передала  команду.

Что говорит отладчик по поводу успешности записи команды в порт ?


Медвежонок Пятачок   (2009-06-15 16:25:00) [9]

тогда см [1]


RWolf   (2009-06-15 16:24:00) [10]

с API функциями порядок, в моем случае вернуть ошибку они не могут (хэндл порта действителен, таймауты приёма/передачи отключены); впрочем, их коды возврата я тоже отслеживал, дело не в них.
Отладчик говорит, что никаких символов ReadFile не принимает.


Сергей М.   (2009-06-15 16:02:00) [11]

Зачем гадать, если под рукой всегда есть отладчик ?
И почему WinAPI- функциииспользуются как процедуры ? Что за самоуверенность ?)


Медвежонок Пятачок   (2009-06-15 16:01:00) [12]

это могут быть чудеса в решете.


Наверх

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