Конференция "WinAPI" » Нe удается открыть вирт. ком-порт, работающий через usbser.sys
 
  • GanibalLector © (10.04.10 14:46) [20]

    > Я просто пишу CreateFile и получаю сабж


    Я бы поступит так :
    - выкинул nrCommLib;
    - написал минимальный пример на чистом API, задействовав все маски;

    см. SetCommMask с флагами EV_RXCHAR , EV_ERR и не только.


    - смотрел что происходит через PortMon

    Опять таки не понятно, как ты работаешь с портом. Какие таймауты стоят на чтение ? Что происходит, когда данные не пришли и т.д.
  • Kolan © (10.04.10 14:49) [21]
    Да че смотреть, я не могу порт открыть. CreateFile завершается ошибкой, буд-то я открываю не существующий порт.
  • GanibalLector © (10.04.10 14:58) [22]

    > Да че смотреть, я не могу порт открыть.


    Ну так это ж происходит не с первой попытки. А после каких-то действий, судя по описанию.

    Давай так. ПК перегрузил, подключил девайс, открываешь порт. Так открывается ?
  • GanibalLector © (10.04.10 15:01) [23]
    Если так уверен в проблеме с usbser.sys. то посмотри на версию. Замени в конце-концов на другую ибо их несколько.
  • Kolan © (10.04.10 15:10) [24]

    > Давай так. ПК перегрузил, подключил девайс, открываешь порт.
    >  Так открывается ?

    Открывается.

    Дальше — вытащил USB.

    Закрыл прогу.

    Подключил USB.

    Открыл прогу.

    Шиш, не открывается.
  • GanibalLector © (10.04.10 15:16) [25]

    > Открывается. Дальше — вытащил USB.Закрыл прогу.


    Ну, а ты проверяешь результат CloseHandle при закрытии программы ? Там ведь, ты закрываешь порт ?

    Повторяю еще раз. Временно выкинь nrCommLib и напиши минимальный пример на API. Тогда все увидишь. И чем больше событий поставишь, тем быстрее разберешься.

    Я думаю, что при "вытащил" тебе должно прийти какое-то событие. В ответ на которые ты должен что-то сделать.
  • GanibalLector © (10.04.10 15:21) [26]

    > CreateFile завершается ошибкой


    Покажи всю ф-цию. Что в параметрах ? Там же есть флаги OPEN_EXISTING и т.д.
    Как работаешь с портом синхронно или асинхронно ?
  • Германн © (10.04.10 15:27) [27]

    > Их нету. Никаких китайских. На железке стоит USB разъем,
    >  который (простите я дилетант) поддерживается самим процессором.

    Нормальные процессоры работают по спецификации USB, а не преобразовывают USB в UART.


    > Да че смотреть, я не могу порт открыть. CreateFile завершается
    > ошибкой, буд-то я открываю не существующий порт.

    Судя по ранее сказанным твоим собственным словам ты пытаешься открыть не несуществующий порт, а занятый порт.
  • Германн © (11.04.10 03:18) [28]
    Ну и ещё.

    > Kolan ©   (10.04.10 12:09) [19]
    >
    >
    > > Ты же вроде что-то пробовал с tpapro?
    >
    > На него забили, он странно подвисал при работе с зед-модемом.
    >  Купили nrComm.
    >
    >

    Если купили, то ...
    Сам догадаешься, что нужно сделать?
  • Kolan © (15.04.10 09:42) [29]
    Вот код из писанного мной компонента:

    function TAnisochronousComm.Open: Boolean;
    begin
     Result := False;
     if FPortHandle <> INVALID_HANDLE_VALUE then
       Close;
     {'\\.\' prefix is nescessary for ports above 9.}
     FPortHandle := CreateFile(PWideChar('\\.\'+FPortName), GENERIC_READ or GENERIC_WRITE,
       0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
     if FPortHandle = INVALID_HANDLE_VALUE then
       Exit;

     ZeroMemory(@FOverlappedRead, SizeOf(@FOverlappedRead));
     ZeroMemory(@FOverlappedWrite, SizeOf(@FOverlappedWrite));
     FOverlappedRead.hEvent := CreateEvent(nil, False, False, nil);
     FOverlappedWrite.hEvent := CreateEvent(nil, False, False, nil);

     SetUserComState;
     SetUserComTimeOuts;
     Purge;
     Result := True;
     SetEvent(FComOpenEvent);
    end;

  • Вариант (15.04.10 12:03) [30]

    > Kolan ©   (15.04.10 09:42) [29]


    CreateFile(PWideChar

    В Delphi 6 в Windows.pas


    > function CreateFile; external kernel32 name 'CreateFileA';


    В этом случе  PWideChar не уместен.
  • Anatoly Podgoretsky © (15.04.10 12:25) [31]
    CreateFileW
  • GanibalLector © (15.04.10 13:05) [32]
    Kolan ©   (15.04.10 09:42) [29]

    С открытием все в порядке.
    Что в  SetUserComTimeOuts ?

    При запуске программы после перегрузки как ведет себя CloseHandle ? Результат проверяешь ?
  • Вариант (15.04.10 13:33) [33]

    > GanibalLector ©   (15.04.10 13:05) [32]
    > Kolan ©   (15.04.10 09:42) [29]
    >
    > С открытием все в порядке.

    Возможно - правда в дельфи 6 это просто не компилируется. Но даже если и прошло , то я бы сделал  тут хотя бы -
    if FPortHandle = INVALID_HANDLE_VALUE then
    begin
     raise Exception.Create(SysErrorMessage(GetLastError)));
    end;
    что бы точно знать причину ошибки.... И так же и в других проблемных местах.
  • Kolan © (15.04.10 15:00) [34]
    Причем тут Д6? Я использую Д2009.

    С открытием все в порядке. Ничего с ним не в порядке.

    CreateFile возвращает INVALID_HANDLE_VALUE. Смысл обсуждать что-то еще?
  • Kolan © (15.04.10 15:02) [35]
    Вот из nrComma код

    function OpenPort(const n:integer):THandle;
    begin
     Result:=CreateFile(PChar('\\?\'+ComPortToStr(n)),(GENERIC_READ + GENERIC_WRITE),0,nil,
       OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
    end;



    Разницы нет.
  • Вариант (15.04.10 15:37) [36]

    > Kolan ©   (15.04.10 15:00) [34]
    > Причем тут Д6? Я использую Д2009.

    При том, что ты не указал версию и что прописано в твоей версии Windows.pas мне неизвестно.


    > Kolan ©   (15.04.10 15:02) [35]



    > Разницы нет.


    ПРоверь так и прочти что будет написано в сообщении

    if FPortHandle = INVALID_HANDLE_VALUE then
    begin
    raise Exception.Create(SysErrorMessage(GetLastError)));
    end;

  • Kolan © (15.04.10 15:49) [37]

    > При том, что ты не указал версию и что прописано в твоей
    > версии Windows.pas мне неизвестно.

    Тогда логичнее было бы спросить вначале.


    > ПРоверь так и прочти что будет написано в сообщении


    Ведь в [0] это написано:

    Проблема в том, что при определенных действиях (гарантировано воспроизвести не удаётся, но это происходит при физическом отключении железки от порта) виртуальный ком-порт определяется в системе (виден в списке оборудование), а работать с ним не удается, функция открытия файла завершается с ошибкой «Не удается найти указанный файл.»
  • Вариант (15.04.10 16:03) [38]

    > Kolan ©   (15.04.10 15:49) [37]


    > Тогда логичнее было бы спросить вначале.

    Нет, логичней было указать версию, ибо поставить галочку надо было при создании темы. Но не суть
    > Ведь в [0] это написано:

    а вот это точно, просто тема так долго висела, что к сегодняшнему дню уже и забыл что было в начале - моя вина, сорри.
  • GanibalLector © (15.04.10 16:22) [39]

    > С открытием все в порядке. Ничего с ним не в порядке.CreateFile
    > возвращает INVALID_HANDLE_VALUE. Смысл обсуждать что-то
    > еще?


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

    Код, который ты привел абсолютно нормальный. И я так открываю. Я считаю, что проблема возникает при закрытии порта.

    Вот для примера. У тебя есть обычные порты (СОМ1,СОМ2)? Открой один из них в гипертерминале, а потом сам попробуй открыть программно. Так вот, не получится ибо он уже занят.
 
Конференция "WinAPI" » Нe удается открыть вирт. ком-порт, работающий через usbser.sys
Есть новые Нет новых   [134431   +15][b:0][p:0.002]