Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.28;
Скачать: CL | DM;

Вниз

чтение из COM-порта - загадочное поведение программы   Найти похожие ветки 

 
RWolf ©   (2009-06-15 15:51) [0]

Обнаружился тут занятный полтергейст с Д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 16:01) [1]

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


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

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


 
RWolf ©   (2009-06-15 16:24) [3]

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


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

тогда см [1]


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


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


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

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


 
RWolf ©   (2009-06-15 16:53) [6]


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

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


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


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


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

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


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


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

но

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


?

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


 
RWolf ©   (2009-06-15 17:03) [9]

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


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


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


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


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


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


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

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


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


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


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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2010.03.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
2-1264114096
Евгений Р.
2010-01-22 01:48
2010.03.28
Как изменить свойство Required поля Access


15-1263145585
И. Павел
2010-01-10 20:46
2010.03.28
Установка драйвера видеокарты на Windows 7


15-1262937611
@!!ex
2010-01-08 11:00
2010.03.28
Бесплатный NAT Proxy для Windows


15-1261889617
NewZ
2009-12-27 07:53
2010.03.28
Paradox.


2-1264423127
helluvaname
2010-01-25 15:38
2010.03.28
как проверить есть ли string среди combobox.items