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

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


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