Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
Wolfpack
Member

Откуда:
Сообщений: 9
проблема возникает когда соединение теряется с компортом. Компорт виртуальный работает через USB.

Я так подозреваю. обработка исключительных ситуаций предложенных в самом компоненте не к чему не приводит - программа так и остается в зависшем состоянии.

Может кто сталкивался с подобной проблемой, или может подскажите более новый компонент для работы с com-портом
2 июл 18, 16:16    [21537112]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10390
Wolfpack
подскажите более новый компонент для работы с com-портом
Тынц
2 июл 18, 16:24    [21537131]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23865
Бывает, что подвисает кривонаписанный драйвер железки.
Проверить легко: когда программа зависает нужно выдернуть преобразователь.
Если ошибка появится (ПО отвиснет), то с компонентой все нормально.
2 июл 18, 16:25    [21537134]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
defecator
Member

Откуда:
Сообщений: 39981
wadman
Бывает, что подвисает кривонаписанный драйвер железки.
Проверить легко: когда программа зависает нужно выдернуть преобразователь.
Если ошибка появится (ПО отвиснет), то с компонентой все нормально.

были случаи, когда выдирание железяки не отвешивало софтину.
2 июл 18, 16:31    [21537140]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
Wolfpack
Member

Откуда:
Сообщений: 9
В том то и дело, что при выдергивании USB кабеля, через который идет соединение с виртуальным ком-портом, при открытом соединении прога виснет на глушняк.

дрова используются вот эти - CP210x_Universal_Windows_Driver
2 июл 18, 16:37    [21537158]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
Wolfpack
Member

Откуда:
Сообщений: 9
уже есть желание плюнуть на все сторонние компоненты и отписать все на чистом WinAPI

пересмотрел много чего но более менее нормальный из бесплатных только TComPort но он уже старенький, он в свое время хорошо работал на 7-ых дельфях
2 июл 18, 16:39    [21537161]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
defecator
Member

Откуда:
Сообщений: 39981
Wolfpack
уже есть желание плюнуть на все сторонние компоненты и отписать все на чистом WinAPI

пересмотрел много чего но более менее нормальный из бесплатных только TComPort но он уже старенький, он в свое время хорошо работал на 7-ых дельфях

дебагером посмотри, где зависон происходит.
2 июл 18, 16:41    [21537169]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3494
Wolfpack
Я так подозреваю. обработка исключительных ситуаций предложенных в самом компоненте не к чему не приводит - программа так и остается в зависшем состоянии.
Для того, чтобы программа не подвисала, с компортом необходимо работать асинхроннр. А "компонент" этого, видимо, не умеет. Либо умеет, но глючит.
Выхода три:
1. Найти ошибку в компоненте и исправить (или переделать его);
2. Написать самому на winapi;
3. Найти новый компонент и молиться, чтобы он не глючил в этом или другом месте, а когда заглючит, снова делать этот выбор.
2 июл 18, 23:18    [21538070]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
defecator
Member

Откуда:
Сообщений: 39981
YuRock
Wolfpack
Я так подозреваю. обработка исключительных ситуаций предложенных в самом компоненте не к чему не приводит - программа так и остается в зависшем состоянии.
Для того, чтобы программа не подвисала, с компортом необходимо работать асинхроннр. А "компонент" этого, видимо, не умеет. Либо умеет, но глючит.
Выхода три:
1. Найти ошибку в компоненте и исправить (или переделать его);
2. Написать самому на winapi;
3. Найти новый компонент и молиться, чтобы он не глючил в этом или другом месте, а когда заглючит, снова делать этот выбор.

4. Найти компонент и посмотреть в его исходный код, как он работает
3 июл 18, 06:57    [21538281]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
Wolfpack
Member

Откуда:
Сообщений: 9
пишу для тех кто столкнется с подобной проблемой, что была у меня с компонентом TComPort

для того чтобы компонент не подвешивал программу при использовании виртуального ком порта через USB

надо изменить метод TCustomComPort.WaitForAsync

function TCustomComPort.WaitForAsync(var AsyncPtr: PAsync): Integer;
var
  BytesTrans, Signaled: DWORD;
  Success: Boolean;
begin
  if AsyncPtr = nil then
    //raise EComPort.CreateNoWinCode
    CallException(CError_InvalidAsync);

  //Signaled := WaitForSingleObject(AsyncPtr^.Overlapped.hEvent, INFINITE);
  Signaled := WaitForSingleObject(AsyncPtr^.Overlapped.hEvent, 100);
  Success := (Signaled = WAIT_OBJECT_0) and
      (GetOverlappedResult(FHandle, AsyncPtr^.Overlapped, BytesTrans, False));

  if not Success then
    //raise EComPort.Create
    CallException(ErrorCode(AsyncPtr), GetLastError);

  if (AsyncPtr^.Kind = okRead) and (InputCount = 0) then
    SendSignalToLink(leRx, False)
  else
    if AsyncPtr^.Data <> nil then
      TxNotifyLink(AsyncPtr^.Data^, AsyncPtr^.Size);

  Result := BytesTrans;
end;


вместо WaitForSingleObject(AsyncPtr^.Overlapped.hEvent, INFINITE); ставим WaitForSingleObject(AsyncPtr^.Overlapped.hEvent, 100); 100 миллисекунд ожидания, в противном случае если порт был открыт и из USB был вытащен шнур, прога зависнет на всегда в ожидании

Изменил
procedure TCustomComPort.AbortAllAsync;
begin
  try
  if not PurgeComm(FHandle, PURGE_TXABORT or PURGE_RXABORT) then
    raise EComPort.Create (CError_PurgeFailed, GetLastError);
    //CallException(CError_PurgeFailed, GetLastError);
  except

  end;
end;

может это и не совсем корректно - но он меня просто достал

изменил
procedure TCustomComPort.Close;
begin
   // if already closed, do nothing
      if FConnected and not(csDesigning in ComponentState) then
      begin
        CallBeforeClose;
        // abort all pending operations
try
        AbortAllAsync;
finally
        // stop monitoring for events
        if FThreadCreated then
        begin
          FEventThread.Free;
          FThreadCreated := False;
          if FSyncMethod = smWindowSync then
{$IFDEF DELPHI_6_OR_HIGHER}
{$WARN SYMBOL_DEPRECATED OFF}
{$ENDIF}
            DeallocateHWnd(FWindow);
{$IFDEF DELPHI_6_OR_HIGHER}
{$WARN SYMBOL_DEPRECATED ON}
{$ENDIF}
        end;
        // close port
        DestroyHandle;
        FConnected := False;
        // port is closed, do any additional finalization
        CallAfterClose;
      end;
end;
end;

для того чтобы порт корректно закрывался если кабель был вытащен из USB


теперь компонент работает более менее стабильно, если что еще найду по нему - отпишусь
6 июл 18, 22:24    [21550942]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3494
Wolfpack
100 миллисекунд ожидания
Это ужасный подход. Так ты будешь терять ответы, которые приходят позже.
Надо просто ждать 2 эвента одновременно - который в оверлаппед-структуре и эвент, который вызывается при отмене ожидания (например, по таймауту ожидания протокола верхнего уровня, или при закрытии проги). В таких случаях еще надо делать CancelIO, чтобы винда не отдуплилась не вовремя и не начала писать туда, чего уже нет.
7 июл 18, 12:11    [21551748]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3494
Вообще, для нормальной асинхронной работы нужен WaitCommEvent и его анализ, чего я не вижу.
Как я и ожидал, этот "компонент" - мрак.
7 июл 18, 12:15    [21551762]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
defecator
Member

Откуда:
Сообщений: 39981
Не знаю, чем там пользуется ТС, но вот два компонента для работы с последовательными портами,
которые себя зарекомендовали просто отлично:

http://synapse.ararat.cz/doku.php/download

и

https://github.com/TurboPack/AsyncPro
7 июл 18, 12:22    [21551774]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
Wolfpack
Member

Откуда:
Сообщений: 9
defecator
Не знаю, чем там пользуется ТС, но вот два компонента для работы с последовательными портами,
которые себя зарекомендовали просто отлично:

http://synapse.ararat.cz/doku.php/download

и

https://github.com/TurboPack/AsyncPro


AsyncPro - я так и не смог поставить на XE7
7 июл 18, 14:14    [21551960]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
Wolfpack
Member

Откуда:
Сообщений: 9
YuRock
Wolfpack
100 миллисекунд ожидания
Это ужасный подход. Так ты будешь терять ответы, которые приходят позже.
Надо просто ждать 2 эвента одновременно - который в оверлаппед-структуре и эвент, который вызывается при отмене ожидания (например, по таймауту ожидания протокола верхнего уровня, или при закрытии проги). В таких случаях еще надо делать CancelIO, чтобы винда не отдуплилась не вовремя и не начала писать туда, чего уже нет.

проблема в том, что сам компонент - даже если я ставлю последовательную работу с комом а не асинхронную, все равно выходит на работу через асинхрон.

Мне уже проще написать свой компонент для работы с комом чем копать этот компонент дальше.

по крайней мере меня сейчас работа компонента устраивает. При вытаскиваниии USB конектора - компонент не подвешивает программу, можно теперь корректно зарыть порт и открыть его заново. Если во время передачи данных на ком порт вытащить USB компонент тоже не вешает прогу на всегда - оставась в вечном ожидании.

У меня с ком-порта все равно данные не приходят чаще чем 1 секунда, так что мне хватает времени, если что переподключиться, тем паче что ком-порт повторяет сигнал, даже если я один пропустил, я получу или второй или третий.

А так по хорошему надо писать полностью свое либо покупать уже обкатанный компонент, который еще продолжют поддерживать.
7 июл 18, 14:22    [21551967]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
Wolfpack
Member

Откуда:
Сообщений: 9
YuRock
Вообще, для нормальной асинхронной работы нужен WaitCommEvent и его анализ, чего я не вижу.
Как я и ожидал, этот "компонент" - мрак.


вот метод
function TCustomComPort.WriteStr(Str: string): Integer;
var
  AsyncPtr: PAsync;
begin
  InitAsync(AsyncPtr);
  try
    WriteStrAsync(Str, AsyncPtr);
    Result := WaitForAsync(AsyncPtr);
  finally
    DoneAsync(AsyncPtr);
  end;
end;


function TCustomComPort.WriteStrAsync(var Str: string; var AsyncPtr: PAsync): Integer;
var sa : Ansistring; var i:integer;
begin

  if Length(Str) > 0 then
  begin
    setlength(sa,length(str));
    {$IFDEF Unicode}
    if length(sa)>0 then
    begin
      for i := 1 to length(str) do sa[i] := ansichar(byte(str[i]));
      move(sa[1],str[1],length(sa));
    end;
    {$ENDIF}
      Result := WriteAsync(Str[1], Length(Str), AsyncPtr)

  end
  else
    Result := 0;

end;


Дальше копать чужой код я уже не стал - уже проще написать самому все и причем на чистом WinAPI
7 июл 18, 14:27    [21551972]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3494
Wolfpack
вот метод
Это вызов каких-то внутренних методов компонента, что делают которые - неизвестно. Такое копипастить сюда нет смысла.
7 июл 18, 14:58    [21552022]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3494
Wolfpack
Дальше копать чужой код я уже не стал - уже проще написать самому все и причем на чистом WinAPI
Это проще было сделать и неделю назад, и две, и сейчас до сих пор. В итоге код окажется надежным и понятным, и размер его будет 2 страницы. И на XE18 установится.
7 июл 18, 15:00    [21552031]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10390
Это п-ц
Wolfpack
      for i := 1 to length(str) do sa[i] := ansichar(byte(str[i]));
      move(sa[1],str[1],length(sa));
7 июл 18, 17:37    [21552296]     Ответить | Цитировать Сообщить модератору
 Re: TComPort EX7 проблема при потери соединения с com-портом приложение подвисает  [new]
defecator
Member

Откуда:
Сообщений: 39981
Wolfpack
defecator
Не знаю, чем там пользуется ТС, но вот два компонента для работы с последовательными портами,
которые себя зарекомендовали просто отлично:

http://synapse.ararat.cz/doku.php/download

и

https://github.com/TurboPack/AsyncPro


AsyncPro - я так и не смог поставить на XE7

по моей ссылке всё ставится на раз
8 июл 18, 07:38    [21553275]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить