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

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

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2019, 09:49   #1
Fedia74
Пользователь
 
Регистрация: 24.03.2019
Сообщений: 29
По умолчанию TLazSerial

Здравствуйте знатоки Лазаруса.

Подскажите как с помощью Библиотеки TLazSerial определить открыт Сом порт уже или нет , дело в том что если он открыт и пытаться его открывать ещё раз не получится и как следствие прога вылетает , а нужно этот момент предусмотреть. Работать с портом вроде как получается , а вот этот момент не выходит . Доку в интернете найти не получается по библиотеки.
Fedia74 вне форума Ответить с цитированием
Старый 22.04.2019, 10:48   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,772
По умолчанию

Код:
if Serial.Active then
p51x вне форума Ответить с цитированием
Старый 22.04.2019, 13:18   #3
Fedia74
Пользователь
 
Регистрация: 24.03.2019
Сообщений: 29
По умолчанию

Это просто переменная которая показывает о подключении или нет Сом порта , а для того что бы узнать занят порт или нет нужно к нему пробовать подцепиться.
А проблема в том что когда подключаешься к занятому порту то выскакивает меню ошибки (Порт занят) с выбором действия , остановить прогу или продолжить и это мешает.
Дело в том что если программно опрашивать порты в поиске нужного , то эта выскакивающая меню очень мешает . И было найдено решение.

В модуле TLazSerial ,были сделаны изменения в двух процедурах

Код:
procedure TLazSerial.DeviceOpen;
begin
  FSynSer.Connect(FDevice);  // тута определение ошибки открытия
  if FSynSer.Handle=INVALID_HANDLE_VALUE
   then
     exit; // отключено вывод меню и выход по ошибке , сделан просто выход из Процедуры 
    //raise Exception.Create('Could not open device '+ FSynSer.Device);

  FSynSer.Config(ConstsBaud[FBaudRate],
                 ConstsBits[FDataBits],
                 ConstsParity[FParity],
                 ConstsStopBits[FStopBits],
                 FSoftflow, FHardflow);

  // Launch Thread
  ReadThread := TComPortReadThread.Create(true);
  ReadThread.Owner := Self;
  ReadThread.MustDie := false;
//  ReadThread.Resume;   --> deprecated
  ReadThread.Start;
end;
И во второй

Код:
procedure TLazSerial.SetActive(state: boolean);
begin
  if state=FActive then  exit;

  if state
   then
    begin
     DeviceOpen;       //Добавлено условие ошибки
     if FSynSer.Handle=INVALID_HANDLE_VALUE
      then state:=false;
    end
   else
     DeviceClose;

  FActive:=state;
end;
В результате окно ошибки не выводится , просто нет подключения к занятому порту .
Теперь можно программно опрашивать порты и если при подключении к порту подключения не произошло , то это значит что порт занят.
И вот тут уже да можно использовать Active и смотреть подключился порт или нет .


РЕШЕНО.

Последний раз редактировалось Fedia74; 22.04.2019 в 13:22.
Fedia74 вне форума Ответить с цитированием
Ответ


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