powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Virtual COM port большая задержка перед повторным открытием после Unplug
3 сообщений из 3, страница 1 из 1
Virtual COM port большая задержка перед повторным открытием после Unplug
    #39572216
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Работаю с виртуальным портом Prolific. После его случайного отключения виртуального порта (физическое разъединение) и повторного втыкания разъема, хочется автоматически открывать порт и продолжать прием данных без дополнительных телодвижений для пользователя.
Все хорошо, но есть проблема: при попытке открыть порт после события DBT_DEVICEARRIVAL, возникает длительная задержка и выдается сообщение 'SetCommState function failed'. Путем некоторых экспериментов, выяснил, что если сделать длительную задержку перед открытием порта (>15сек), то порт нормально открывается и данные продолжают приниматься как ни в чем не бывало.
Код: 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.
33.
34.
35.
procedure TfrmMain.VirtCOMArrival(Sender: TObject);
var
 WaitTick :cardinal;
 SaveCursor :TCursor;
 Idx :integer;
begin
  Idx := FindPortDevice(ComponentVirtCOM.DevName, ptNone); // проверяем, есть ли новый порт в списке обрабатываемых
  if(Idx<>-1)then
   with HandPorts[Idx] do
    try
     if Assigned(sspComPort)and not sspComPort.Connected then // sspComPort :TComPort;
      begin
       SaveCursor := Screen.Cursor;
       try
        Screen.Cursor := crHourGlass;

// задержка перед попыткой открытия порта
        WaitTick := GetTickCount+18*MSecsPerSec; // задержка в 18 сек.
        while GetTickCount<WaitTick do
         begin
          Application.ProcessMessages;
          sleep(100); // обрабатываем остальные порты в другом потоке
         end;
// попытка открытия нового порта
        sspComPort.Open;
        sspPortType := ptSerial;
       finally
        Screen.Cursor := SaveCursor;
       end;
    except
     on E:Exception do
      Application.MessageBox(PChar(Format(meOpenPortErrFmt,[sspDevStr,E.Message])),
                            PChar(mWarning), MB_ICONWARNING+MB_OK);
    end;
end;



Не очень изящное решение, да и ждать долго.
Есть ли какое-либо событие Windows гарантирующее, что порт полностью готов к работе?

Возможно это поможет, данные в порт валят такие, что винда почему-то думает, что подключен Microsoft BallPoint трекбол для посл.порта (на фото - COM7). Хотя это данные аппаратного счетчика (сторонний производитель).

В первый раз порт открывается нормально, хотя тоже могут быть проблемы (полагаю что из-за этого).

Заранее спасибо!
...
Рейтинг: 0 / 0
Virtual COM port большая задержка перед повторным открытием после Unplug
    #39572322
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky SergeЕсть ли какое-либо событие Windows гарантирующее, что порт полностью готов к работе?
Не знаю. Чем тебе не хватает гарантии, что если порт открылся, то он готов к работе? Просто пробуй открыть его когда понадобится, и всё.
Если постоянно надо - то сделай такую попытку реконнекта: раз в секунду в течение 30 секунд. Не получилось - увеличивай таймаут.
...
Рейтинг: 0 / 0
Virtual COM port большая задержка перед повторным открытием после Unplug
    #39572466
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос закрыт, дело было в драйверах. Установил последние, задержка при открытии порта сократилась до пару секунд и исчезло обнаружение Microsoft BallPoint трекбол.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Virtual COM port большая задержка перед повторным открытием после Unplug
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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