Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2010, 18:02   #1
varelik
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 140
По умолчанию освободить СОМ порт

Здравствуйте.
Подскажите, как и в какой процедуре можно освободить программно СОМ порт?
Используя компонент Tcom, делаю следующее:
Код:
procedure xxx();
var---;
begin
try
comm1.connect;
except
showmessage('порт нельзя открыть.');
exit
end;
showmessage('порт открыт.');
далее передаю байты
end;
вобщемто все работает, Но! если моя прога хоть часок просто будет открыта, потом при попытке передать байты всплывет: порт нельзя открыть.
varelik вне форума Ответить с цитированием
Старый 09.02.2010, 19:52   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

по логике вещей, comm1.disconnect... а вообще не видно всей процедуры вашей, если вы после того как порт открыли, так его и оставили, то оно правильно всплывает при повторном использовании этой-же процедуры.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 10.02.2010, 09:41   #3
varelik
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 140
По умолчанию

вобщем код щелчка по кнопке такой:
Код:
procedure TForm1.N10Click(Sender: TObject);
var   f3:file of byte;
k,kk,t:string; 
i5,h:integer;p,b:byte;
begin

try
 comm1.Connect;
except
 showmessage('Порт невозможно открыть');
 exit
end;
showmessage('Порт открыт');
 AssignFile(f3,'C:\xx.txt');
 reset(f3);  
k:='cтрока';
for i5:=1 to length(k) do comm1.SendByte(ord(k[i5]));
b:=$0D;Comm1.SendByte(b);


while not eof(f3) do begin 
read(f3,p);
comm1.SendByte(p);
end;
closefile(f3);


kk:='другая строка';
for i5:=1 to length(kk) do comm1.SendByte(ord(kk[i5]));
b:=$0D;Comm1.SendByte(b);

end;
varelik вне форума Ответить с цитированием
Старый 10.02.2010, 09:49   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

1- отделите процедуру connect от посылки данных
2- либо сделайте disconnect после посылки.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 10.02.2010, 10:16   #5
varelik
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 140
По умолчанию

Спасибо за совет.
Вот мне 1й вариант больше нравится,
т.к. ничего похожего на дисконект не нашел. есть только:
free,
destroy,
done(деструктор).
Теперь час-другой буду тестить
varelik вне форума Ответить с цитированием
Старый 10.02.2010, 10:17   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

приложите сей компонент тут, глянем... вообще достаточно освободить хэндл для закрытия порта CloseHandle().
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 10.02.2010 в 10:21.
raxp вне форума Ответить с цитированием
Старый 10.02.2010, 14:57   #7
varelik
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 140
По умолчанию

вот компонент.
кстати 1й вариант почемуто не сработал(
Вложения
Тип файла: zip MyCom.zip (38.9 Кб, 15 просмотров)
varelik вне форума Ответить с цитированием
Старый 10.02.2010, 15:38   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Цитата:
1й вариант почемуто не сработал
показывайте как делали...

в компоненте процедура connect уже содержит проверку и освобождение хэндла... немножко странная реализация заполнения DCB и только... потестировал у себя, такого как у вас глюка нет... опробуйте еще вот этот компонент (BComPort), отзывы о нем неплохие...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 10.02.2010, 15:52   #9
varelik
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 140
По умолчанию

1) делал так: из procedure TForm1.N10Click(Sender: TObject); (описана в моем 2м сообщении этой темы)
удалил вот "это":
Код:
try
 comm1.Connect;
except
 showmessage('Порт невозможно открыть');
 exit
end;
showmessage('Порт открыт');
и поместил "это" в онклик другой кнопки.
И вот еще что: моя прога реализована через activeform (OCX), который я потом в WORDe через VBA запускаю.

Последний раз редактировалось varelik; 10.02.2010 в 16:00.
varelik вне форума Ответить с цитированием
Старый 10.02.2010, 16:12   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

обработчик некорректный, вы при любой ошибке получите сообщение что "порт невозможно открыть", а таких сообщений внутри процедуры "connect" аж 3 (заметьте - процедуры)/

...так что пробуйте bcomport, в нем эти вещи "вылизаны"
...что касается activex, проблемы могут возникнуть, если будет более одного запущенного экземпляра
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 10.02.2010 в 16:14.
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как инициализировать СОМ порт? luocky Общие вопросы Delphi 12 14.11.2009 13:32
СОМ порт JUDAS Win Api 0 10.01.2009 21:27
вопрос про СОМ-порт фЁдОр Компьютерное железо 8 29.12.2008 16:04
СОМ порт SERG1980 Общие вопросы Delphi 3 17.05.2007 08:06
СОМ порт IR управление мультимедиа Andr12 Свободное общение 2 10.02.2007 12:07