Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TComPort EX7 проблема при потери соединения с com-портом приложение подвисает / 20 сообщений из 20, страница 1 из 1
02.07.2018, 16:16
    #39668424
Wolfpack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
проблема возникает когда соединение теряется с компортом. Компорт виртуальный работает через USB.

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

Может кто сталкивался с подобной проблемой, или может подскажите более новый компонент для работы с com-портом
...
Рейтинг: 0 / 0
02.07.2018, 16:24
    #39668429
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
Wolfpackподскажите более новый компонент для работы с com-портом Тынц
...
Рейтинг: 0 / 0
02.07.2018, 16:25
    #39668430
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
Бывает, что подвисает кривонаписанный драйвер железки.
Проверить легко: когда программа зависает нужно выдернуть преобразователь.
Если ошибка появится (ПО отвиснет), то с компонентой все нормально.
...
Рейтинг: 0 / 0
02.07.2018, 16:31
    #39668431
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
wadmanБывает, что подвисает кривонаписанный драйвер железки.
Проверить легко: когда программа зависает нужно выдернуть преобразователь.
Если ошибка появится (ПО отвиснет), то с компонентой все нормально.
были случаи, когда выдирание железяки не отвешивало софтину.
...
Рейтинг: 0 / 0
02.07.2018, 16:37
    #39668436
Wolfpack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
В том то и дело, что при выдергивании USB кабеля, через который идет соединение с виртуальным ком-портом, при открытом соединении прога виснет на глушняк.

дрова используются вот эти - CP210x_Universal_Windows_Driver
...
Рейтинг: 0 / 0
02.07.2018, 16:39
    #39668437
Wolfpack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
уже есть желание плюнуть на все сторонние компоненты и отписать все на чистом WinAPI

пересмотрел много чего но более менее нормальный из бесплатных только TComPort но он уже старенький, он в свое время хорошо работал на 7-ых дельфях
...
Рейтинг: 0 / 0
02.07.2018, 16:41
    #39668438
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
Wolfpackуже есть желание плюнуть на все сторонние компоненты и отписать все на чистом WinAPI

пересмотрел много чего но более менее нормальный из бесплатных только TComPort но он уже старенький, он в свое время хорошо работал на 7-ых дельфях
дебагером посмотри, где зависон происходит.
...
Рейтинг: 0 / 0
02.07.2018, 23:18
    #39668552
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
WolfpackЯ так подозреваю. обработка исключительных ситуаций предложенных в самом компоненте не к чему не приводит - программа так и остается в зависшем состоянии.Для того, чтобы программа не подвисала, с компортом необходимо работать асинхроннр. А "компонент" этого, видимо, не умеет. Либо умеет, но глючит.
Выхода три:
1. Найти ошибку в компоненте и исправить (или переделать его);
2. Написать самому на winapi;
3. Найти новый компонент и молиться, чтобы он не глючил в этом или другом месте, а когда заглючит, снова делать этот выбор.
...
Рейтинг: 0 / 0
03.07.2018, 06:57
    #39668567
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
YuRockWolfpackЯ так подозреваю. обработка исключительных ситуаций предложенных в самом компоненте не к чему не приводит - программа так и остается в зависшем состоянии.Для того, чтобы программа не подвисала, с компортом необходимо работать асинхроннр. А "компонент" этого, видимо, не умеет. Либо умеет, но глючит.
Выхода три:
1. Найти ошибку в компоненте и исправить (или переделать его);
2. Написать самому на winapi;
3. Найти новый компонент и молиться, чтобы он не глючил в этом или другом месте, а когда заглючит, снова делать этот выбор.
4. Найти компонент и посмотреть в его исходный код, как он работает
...
Рейтинг: 0 / 0
06.07.2018, 22:24
    #39670910
Wolfpack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
пишу для тех кто столкнется с подобной проблемой, что была у меня с компонентом TComPort

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

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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 был вытащен шнур, прога зависнет на всегда в ожидании

Изменил
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;


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

изменил
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
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


теперь компонент работает более менее стабильно, если что еще найду по нему - отпишусь
...
Рейтинг: 0 / 0
07.07.2018, 12:11
    #39670984
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
Wolfpack100 миллисекунд ожиданияЭто ужасный подход. Так ты будешь терять ответы, которые приходят позже.
Надо просто ждать 2 эвента одновременно - который в оверлаппед-структуре и эвент, который вызывается при отмене ожидания (например, по таймауту ожидания протокола верхнего уровня, или при закрытии проги). В таких случаях еще надо делать CancelIO, чтобы винда не отдуплилась не вовремя и не начала писать туда, чего уже нет.
...
Рейтинг: 0 / 0
07.07.2018, 12:15
    #39670986
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
Вообще, для нормальной асинхронной работы нужен WaitCommEvent и его анализ, чего я не вижу.
Как я и ожидал, этот "компонент" - мрак.
...
Рейтинг: 0 / 0
07.07.2018, 12:22
    #39670987
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
Не знаю, чем там пользуется ТС, но вот два компонента для работы с последовательными портами,
которые себя зарекомендовали просто отлично:

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

и

https://github.com/TurboPack/AsyncPro
...
Рейтинг: 0 / 0
07.07.2018, 14:14
    #39671004
Wolfpack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
defecatorНе знаю, чем там пользуется ТС, но вот два компонента для работы с последовательными портами,
которые себя зарекомендовали просто отлично:

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

и

https://github.com/TurboPack/AsyncPro

AsyncPro - я так и не смог поставить на XE7
...
Рейтинг: 0 / 0
07.07.2018, 14:22
    #39671008
Wolfpack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
YuRockWolfpack100 миллисекунд ожиданияЭто ужасный подход. Так ты будешь терять ответы, которые приходят позже.
Надо просто ждать 2 эвента одновременно - который в оверлаппед-структуре и эвент, который вызывается при отмене ожидания (например, по таймауту ожидания протокола верхнего уровня, или при закрытии проги). В таких случаях еще надо делать CancelIO, чтобы винда не отдуплилась не вовремя и не начала писать туда, чего уже нет.
проблема в том, что сам компонент - даже если я ставлю последовательную работу с комом а не асинхронную, все равно выходит на работу через асинхрон.

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

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

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

А так по хорошему надо писать полностью свое либо покупать уже обкатанный компонент, который еще продолжют поддерживать.
...
Рейтинг: 0 / 0
07.07.2018, 14:27
    #39671009
Wolfpack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
YuRockВообще, для нормальной асинхронной работы нужен WaitCommEvent и его анализ, чего я не вижу.
Как я и ожидал, этот "компонент" - мрак.

вот метод
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function TCustomComPort.WriteStr(Str: string): Integer;
var
  AsyncPtr: PAsync;
begin
  InitAsync(AsyncPtr);
  try
    WriteStrAsync(Str, AsyncPtr);
    Result := WaitForAsync(AsyncPtr);
  finally
    DoneAsync(AsyncPtr);
  end;
end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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
...
Рейтинг: 0 / 0
07.07.2018, 14:58
    #39671018
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
Wolfpackвот методЭто вызов каких-то внутренних методов компонента, что делают которые - неизвестно. Такое копипастить сюда нет смысла.
...
Рейтинг: 0 / 0
07.07.2018, 15:00
    #39671021
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
WolfpackДальше копать чужой код я уже не стал - уже проще написать самому все и причем на чистом WinAPIЭто проще было сделать и неделю назад, и две, и сейчас до сих пор. В итоге код окажется надежным и понятным, и размер его будет 2 страницы. И на XE18 установится.
...
Рейтинг: 0 / 0
07.07.2018, 17:37
    #39671054
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
Это п-цWolfpack
Код: pascal
1.
2.
      for i := 1 to length(str) do sa[i] := ansichar(byte(str[i]));
      move(sa[1],str[1],length(sa));
...
Рейтинг: 0 / 0
08.07.2018, 07:38
    #39671150
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
WolfpackdefecatorНе знаю, чем там пользуется ТС, но вот два компонента для работы с последовательными портами,
которые себя зарекомендовали просто отлично:

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

и

https://github.com/TurboPack/AsyncPro

AsyncPro - я так и не смог поставить на XE7
по моей ссылке всё ставится на раз
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TComPort EX7 проблема при потери соединения с com-портом приложение подвисает / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]