Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2015.04.05;
Скачать: [xml.tar.bz2];

Вниз

Нe удается открыть вирт. ком-порт, работающий через usbser.sys   Найти похожие ветки 

 
Kolan ©   (2010-04-09 10:18) [0]

Здравствуйте!

Есть железка, которая представляется как USB-функция и реализует ACM совместимый USB CDC профиль (это я написал под диктовку нашего «железячника»).

Для подключение к Винде мы использовали драйвер usbser.sys из Виндоус Икс-Пи (второй сервис пак).

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

Причем дело врядли в конкретной программе, так как доступ к порту в этом случае не может получить ни одна программа вообще (пробовали ZOC и пр.).

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

Вопросы: В чем может быть дело? Как это исправить?


 
brother ©   (2010-04-09 10:31) [1]

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

если отключили, то с чего бы ему работать? не понял, в чем проблемма?


 
Дмитрий Белькевич   (2010-04-09 10:41) [2]

Думаю, что наиболее вероятны глюки в драйвере железяки.


 
Kolan ©   (2010-04-09 12:01) [3]

«если отключили, то с чего бы ему работать? не понял, в чем проблемма?»

Был 19 порт. Отключили. Порт пропал. Подключили снова. Снова появился 19 порт, но открыть его не получается.

Дальше можно переключать до посинения, пока в другой разъем не переткнешь, чтобы 18 порт определился, открыть не получится.


 
Kolan ©   (2010-04-09 12:13) [4]

В железке стоит uClinux и используется 527 BlackFin, в котором уже есть поддержка USB. Соответственно используются стандартные драйвера. Профиль CDC реализован Линуксом (модуль g_serial).

Кроме того, при подключении железки к компьютеру с Линуксом проблем не наблюдается.


 
Kolan ©   (2010-04-09 13:31) [5]

Мне кажется дело в том, что когда программа отрыта — она занимает ком порт. Если я отключаю USB во время работы программы, то он пропадает из системы, но остается, видимо, занятым.

Когда я возвращаю USB назад, то, наверно, та занятость порта как-то  мешает работе с новым.

Есть идеи по этому поводу.


 
Германн ©   (2010-04-09 13:48) [6]


> Есть идеи по этому поводу.

Идеи есть. Слов нет литературных.


 
Германн ©   (2010-04-09 14:04) [7]


> Kolan ©   (09.04.10 13:31) [5]

Как с портом работаешь?


 
Kolan ©   (2010-04-09 14:13) [8]

Ну ты попробуй, все-таки.


 
Kolan ©   (2010-04-09 14:14) [9]

Открываю в начале программы, закрываю в конце.


 
Германн ©   (2010-04-09 14:15) [10]


> Kolan ©   (09.04.10 14:14) [9]
>
> Открываю в начале программы, закрываю в конце.
>

Доппотоки используешь?


 
Kolan ©   (2010-04-09 14:20) [11]

Я использую компонент nrCommLib. Он, вроде, использует.


 
Kolan ©   (2010-04-09 16:35) [12]

Что-то еще нужно? Исходники nrCommLib есть, если нужно — могу детальнее описать что и как.


 
Германн ©   (2010-04-10 00:38) [13]


> Kolan ©   (09.04.10 14:20) [11]

Ты же вроде что-то пробовал с tpapro?
Проверено на возможно похожей железяке (микросхема FT232RL). Tapdcomport проблем не вызывает. В то время как программы (созданные двумя моими знакомыми) читающие/пишущие в СОМ-порт в доппотоках при отключении этой железяки от USB порта обязательно вызывают какой-нибудь кошмар. По-моему было как-то подобное твоему эффекту. Но чаще всего этот эффект затмевается тем, что происходит полное зависание системы, которое снимается только эникеем.


 
GanibalLector ©   (2010-04-10 00:58) [14]

А смотрел, что вообще происходит с портом ? Есть же PortMon. Открой и посмотри. Все сразу ясно станет.

Там ты увидишь, закрывается порт или нет.

З.Ы. А вообще, "домашку" пора делать ))


 
Германн ©   (2010-04-10 02:07) [15]


> GanibalLector ©   (10.04.10 00:58) [14]
>
> А смотрел, что вообще происходит с портом ? Есть же PortMon.
>  Открой и посмотри. Все сразу ясно станет.
>
> Там ты увидишь, закрывается порт или нет.
>

Уверен что не увидит. Или увидит но не то.


 
Германн ©   (2010-04-10 02:10) [16]


> Дмитрий Белькевич   (09.04.10 10:41) [2]
>
> Думаю, что наиболее вероятны глюки в драйвере железяки.

Хоть и возможно, но вряд ли. Заметь что автор использовал драйвер от MS.


 
Германн ©   (2010-04-10 02:15) [17]

В целом я считаю правильным перемещение топика в WinAPI. Но боюсь толку от этого будет немного. Бо тут "непаханное поле".
Идиотские преобразователи USB <--> UART.
Непонятные драйвера к ним.
И плюс дебильная работа с СОМ-портом. Не сочтите за хамство. (с) Jeer


 
Anatoly Podgoretsky ©   (2010-04-10 09:56) [18]

> Германн  (10.04.2010 02:15:17)  [17]

У нас кроме WinAPI еще есть и Для Начинающих и Прочее, так что в сложных случаях есть куда перемещать.

По преобразователям и по драйверам согласен, типичные китайско/индуские поделки. Но других то нет.


 
Kolan ©   (2010-04-10 12:09) [19]


> Ты же вроде что-то пробовал с tpapro?

На него забили, он странно подвисал при работе с зед-модемом. Купили nrComm.

Но компонент тут не причем. Я просто пишу CreateFile и получаю сабж, то есть компоненты тут не причем.


> Идиотские преобразователи USB <--> UART.

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

Портмоном смотрел

Вот закрытие, когда пока работала программа выдернул USB.

697 12:00:10 miniCalibrator. IRP_MJ_READ USBSER000 SUCCESS Length 8: root:~>  
698 12:00:10 miniCalibrator. IOCTL_SERIAL_GET_MODEMSTATUS USBSER000 SUCCESS  
699 12:00:53 miniCalibrator. IOCTL_SERIAL_GET_COMMSTATUS USBSER000 SUCCESS  
700 12:00:53 miniCalibrator. IOCTL_SERIAL_SET_WAIT_MASK USBSER000 SUCCESS Mask:  
701 12:00:53 miniCalibrator. IRP_MJ_CLEANUP USBSER000 SUCCESS  
702 12:00:53 miniCalibrator. IRP_MJ_CLOSE USBSER000 SUCCESS  


Вот когда не выдергивал.

895 12:04:23 miniCalibrator. IRP_MJ_READ USBSER001 SUCCESS Length 8: root:~>  
896 12:04:23 miniCalibrator. IOCTL_SERIAL_GET_MODEMSTATUS USBSER001 SUCCESS  
897 12:04:29 miniCalibrator. IOCTL_SERIAL_GET_COMMSTATUS USBSER001 SUCCESS  
898 12:04:29 miniCalibrator. IOCTL_SERIAL_SET_WAIT_MASK USBSER001 SUCCESS Mask:  
899 12:04:29 miniCalibrator. IRP_MJ_CLEANUP USBSER001 SUCCESS  
900 12:04:29 miniCalibrator. IRP_MJ_CLOSE USBSER001 SUCCESS  


Разницы нет.

Портмону, тоже плохеет, кстати. Если он подцепился на 19 порт, и потом переткнуть USB — ничего не показывает.

Может есть другой драйвер? Этот, кроме сабжа, еще и сообщение не умеет нормальное отправить (http://delphimaster.net/view/1-1268895548/).

Мне пришлось супер удобную штуку заменить на ручной скан портов в цикле, который еще и, по своей сути, не всегда работает.


 
GanibalLector ©   (2010-04-10 14:46) [20]


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


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

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

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

Опять таки не понятно, как ты работаешь с портом. Какие таймауты стоят на чтение ? Что происходит, когда данные не пришли и т.д.


 
Kolan ©   (2010-04-10 14:49) [21]

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


 
GanibalLector ©   (2010-04-10 14:58) [22]


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


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

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


 
GanibalLector ©   (2010-04-10 15:01) [23]

Если так уверен в проблеме с usbser.sys. то посмотри на версию. Замени в конце-концов на другую ибо их несколько.


 
Kolan ©   (2010-04-10 15:10) [24]


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

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

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

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

Подключил USB.

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

Шиш, не открывается.


 
GanibalLector ©   (2010-04-10 15:16) [25]


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


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

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

Я думаю, что при "вытащил" тебе должно прийти какое-то событие. В ответ на которые ты должен что-то сделать.


 
GanibalLector ©   (2010-04-10 15:21) [26]


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


Покажи всю ф-цию. Что в параметрах ? Там же есть флаги OPEN_EXISTING и т.д.
Как работаешь с портом синхронно или асинхронно ?


 
Германн ©   (2010-04-10 15:27) [27]


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

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


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

Судя по ранее сказанным твоим собственным словам ты пытаешься открыть не несуществующий порт, а занятый порт.


 
Германн ©   (2010-04-11 03:18) [28]

Ну и ещё.

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

Если купили, то ...
Сам догадаешься, что нужно сделать?


 
Kolan ©   (2010-04-15 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;


 
Вариант   (2010-04-15 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 ©   (2010-04-15 12:25) [31]

CreateFileW


 
GanibalLector ©   (2010-04-15 13:05) [32]

Kolan ©   (15.04.10 09:42) [29]

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

При запуске программы после перегрузки как ведет себя CloseHandle ? Результат проверяешь ?


 
Вариант   (2010-04-15 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 ©   (2010-04-15 15:00) [34]

Причем тут Д6? Я использую Д2009.

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

CreateFile возвращает INVALID_HANDLE_VALUE. Смысл обсуждать что-то еще?


 
Kolan ©   (2010-04-15 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;


Разницы нет.


 
Вариант   (2010-04-15 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 ©   (2010-04-15 15:49) [37]


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

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


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


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

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


 
Вариант   (2010-04-15 16:03) [38]


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


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

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

а вот это точно, просто тема так долго висела, что к сегодняшнему дню уже и забыл что было в начале - моя вина, сорри.


 
GanibalLector ©   (2010-04-15 16:22) [39]


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


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

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

Вот для примера. У тебя есть обычные порты (СОМ1,СОМ2)? Открой один из них в гипертерминале, а потом сам попробуй открыть программно. Так вот, не получится ибо он уже занят.


 
Kolan ©   (2010-04-15 16:29) [40]


> Так вот, не получится ибо он уже занят.
>

Да, и скажут, что Отказано в доступе, а тут вообще говорят, что его нет. То есть в системе он есть, а CreateFile говорит, что нет.



Страницы: 1 2 вся ветка

Форум: "WinAPI";
Текущий архив: 2015.04.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.003 c
15-1407842581
БарЛог
2014-08-12 15:23
2015.04.05
Комбинаторная задачка про NUM-клавиатуру


15-1408134602
Юрий
2014-08-16 00:30
2015.04.05
С днем рождения ! 16 августа 2014 суббота


15-1408429305
47RONYN
2014-08-19 10:21
2015.04.05
IP-телефония и Е1


15-1408554196
Пашка.
2014-08-20 21:03
2015.04.05
Зачем нужны Regexp-ы?


15-1408605148
Ламот
2014-08-21 11:12
2015.04.05
Помогите опознать содержимое пож.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский