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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2012, 23:22   #1
Demien
Форумчанин
 
Аватар для Demien
 
Регистрация: 01.08.2007
Сообщений: 222
Вопрос Не могу закрыть СОМ порт

Открываю СОМ порт:
Код:
hPort := CreateFile(PChar('COM'+Edit1.Text),
                      GENERIC_READ,
                      0, nil,
                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hPort = INVALID_HANDLE_VALUE then
  begin
   Label1.Caption:='Порт открыть не удалось';
   exit;
  end;

  // Настройки порта
  Dcb.BaudRate := CBR_19200;
  Dcb.Parity := NOPARITY;
  Dcb.ByteSize := 8;
  Dcb.StopBits := ONESTOPBIT;
  DCB.Flags := 20625;
  if not SetCommState(hPort, Dcb) then
  raise Exception.Create('Error setting port state');

  Label1.Caption:='Порт открыт';
  Timer1.Enabled:=True;
На таймере вешаю запуск потока:
Код:
beginthread(nil, 1024, @COMRead, nil, 0, th1);
В потоке:
Код:
Size:=30;
  ReadFile(hPort, Buffer, Size, NumberOfBytesReaded, nil);
  Form1.Memo1.Lines.Add(String(Buffer));
  ExitThread(0);
Когда наигрался с портом пытаюсь закрыть его:
Код:
Timer1.Enabled:=False;
CloseHandle(hPort);
Label1.Caption:='Порт закрыт';
Все работает как часы! До того момента пока я не пытаюсь закрыть СОМ порт. Потом программа виснет "наглухо"...
Что и где я делаю неверно?
Жить тоже вредно, от этого умирают!!!
Demien вне форума Ответить с цитированием
Старый 30.10.2012, 00:42   #2
Demien
Форумчанин
 
Аватар для Demien
 
Регистрация: 01.08.2007
Сообщений: 222
По умолчанию

Есть наблюдения!
Вся проблемма, как выяснилось опытным путем, не в остключении СОМ порта а в таймере...
Подскажите: Чем заменить таймер (при условии что проверка наличия пакета с ком порта должна проходить не реже 100 милисекунд)?
Жить тоже вредно, от этого умирают!!!
Demien вне форума Ответить с цитированием
Старый 30.10.2012, 01:49   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а зачем вы вешаете в таймере (потоке) запуск другого потока и потом убиваете?

- пробуем открыть порт
- задаем маску отслеживания сигналов RS-232
- задаем настройки RS-232 (стоп-бит, четность, скорость)
- создаем параллельный поток

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

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lazarus, СОМ порт gusluk Lazarus, Free Pascal, CodeTyphon 10 22.07.2011 04:12
сом порт , БД olegd Помощь студентам 7 05.07.2010 10:34
освободить СОМ порт varelik Общие вопросы Delphi 11 11.02.2010 21:49
СОМ порт JUDAS Win Api 0 10.01.2009 21:27
СОМ порт SERG1980 Общие вопросы Delphi 3 17.05.2007 08:06