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

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

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

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

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

пересмотрел много чего но более менее нормальный из бесплатных только TComPort но он уже старенький, он в свое время хорошо работал на 7-ых дельфях
дебагером посмотри, где зависон происходит.
...
Рейтинг: 0 / 0
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
    #39668552
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WolfpackЯ так подозреваю. обработка исключительных ситуаций предложенных в самом компоненте не к чему не приводит - программа так и остается в зависшем состоянии.Для того, чтобы программа не подвисала, с компортом необходимо работать асинхроннр. А "компонент" этого, видимо, не умеет. Либо умеет, но глючит.
Выхода три:
1. Найти ошибку в компоненте и исправить (или переделать его);
2. Написать самому на winapi;
3. Найти новый компонент и молиться, чтобы он не глючил в этом или другом месте, а когда заглючит, снова делать этот выбор.
...
Рейтинг: 0 / 0
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
    #39668567
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
YuRockWolfpackЯ так подозреваю. обработка исключительных ситуаций предложенных в самом компоненте не к чему не приводит - программа так и остается в зависшем состоянии.Для того, чтобы программа не подвисала, с компортом необходимо работать асинхроннр. А "компонент" этого, видимо, не умеет. Либо умеет, но глючит.
Выхода три:
1. Найти ошибку в компоненте и исправить (или переделать его);
2. Написать самому на winapi;
3. Найти новый компонент и молиться, чтобы он не глючил в этом или другом месте, а когда заглючит, снова делать этот выбор.
4. Найти компонент и посмотреть в его исходный код, как он работает
...
Рейтинг: 0 / 0
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
    #39670910
Wolfpack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пишу для тех кто столкнется с подобной проблемой, что была у меня с компонентом 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
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
    #39670984
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wolfpack100 миллисекунд ожиданияЭто ужасный подход. Так ты будешь терять ответы, которые приходят позже.
Надо просто ждать 2 эвента одновременно - который в оверлаппед-структуре и эвент, который вызывается при отмене ожидания (например, по таймауту ожидания протокола верхнего уровня, или при закрытии проги). В таких случаях еще надо делать CancelIO, чтобы винда не отдуплилась не вовремя и не начала писать туда, чего уже нет.
...
Рейтинг: 0 / 0
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
    #39670986
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, для нормальной асинхронной работы нужен WaitCommEvent и его анализ, чего я не вижу.
Как я и ожидал, этот "компонент" - мрак.
...
Рейтинг: 0 / 0
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
    #39670987
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Не знаю, чем там пользуется ТС, но вот два компонента для работы с последовательными портами,
которые себя зарекомендовали просто отлично:

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

и

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

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

и

https://github.com/TurboPack/AsyncPro

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

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

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

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

А так по хорошему надо писать полностью свое либо покупать уже обкатанный компонент, который еще продолжют поддерживать.
...
Рейтинг: 0 / 0
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
    #39671009
Wolfpack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
    #39671018
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wolfpackвот методЭто вызов каких-то внутренних методов компонента, что делают которые - неизвестно. Такое копипастить сюда нет смысла.
...
Рейтинг: 0 / 0
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
    #39671021
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WolfpackДальше копать чужой код я уже не стал - уже проще написать самому все и причем на чистом WinAPIЭто проще было сделать и неделю назад, и две, и сейчас до сих пор. В итоге код окажется надежным и понятным, и размер его будет 2 страницы. И на XE18 установится.
...
Рейтинг: 0 / 0
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
    #39671054
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это п-ц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
TComPort EX7 проблема при потери соединения с com-портом приложение подвисает
    #39671150
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
WolfpackdefecatorНе знаю, чем там пользуется ТС, но вот два компонента для работы с последовательными портами,
которые себя зарекомендовали просто отлично:

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

и

https://github.com/TurboPack/AsyncPro

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


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