Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1237429884
DelphiN!
2009-03-19 05:31
2010.03.28
Создание "скрытого" поля в FireBird


15-1263112641
Nic
2010-01-10 11:37
2010.03.28
Соединение из Delphi MSSQL Server через RDP. Как?


1-1245677150
Дмитрий Белькевич
2009-06-22 17:25
2010.03.28
Возможно ли поменять resourcestring в рантайме?


2-1264406286
alexbor777
2010-01-25 10:58
2010.03.28
Не все показывается в FR3


11-1215025564
Сашик
2008-07-02 23:06
2010.03.28
Запись в ресурсы DLL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский