Форум: "Основная";
Текущий архив: 2010.03.28;
Скачать: [xml.tar.bz2];
Внизчтение из 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c