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