Перейти к содержанию
    

USB CDC +HAL. Как правильно обрабатывать переподключение?

11 часов назад, -=Женек=- сказал:

Ну или может если кто не работал именно с таким компонентом, но подскажет куда копать?

Посмотрите сюда: https://www.codeproject.com/Articles/2609/Enumerating-serial-ports-W2K-style

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, -=Женек=- said:

Скажите, как прочитать имя устройста, определяющегося как компорт?

У меня на компе проект в Embarcadero, в нем компонент TAdpComport (из пакета AsyncPro). Кто -то работал с таким?

У компонента TAdpComport нет такого сервиса.
В Embarcadero это делается вызовами непосредственно Windows API с использованием портированых хидеров Windows из библиотеки JVCL.

Вот мой проект запускателя терминалоа по VID и PID. - https://github.com/Indemsys/VCOM_Terminal_opener
Имя дивайса тоже мог бы показывать, но тут надо помнить что имя будет одно на все порты, а дивайсе-то несколько портов может быть. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 минут назад, AlexandrY сказал:

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

Можно показывать имя (оно берётся из inf-файла на компе) + серийный номер (берётся из устройства во время энумерации). В серийный номер можно установить любую строку, не обязательно только из цифр.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так... с рыбой в речке разобрался.... Вернулся домой, разбираюсь с USB

 

АНТОХА

Quote

Тогда надо ручками:

* при старте инициализируете ногу A12 как выход, переводите в 0 и ждёте немножко

* потом переключаете A12 в ANALOGINPUT, и вызываете инициализацию USB.

Получилось.

Только я даже не переключал ногу в ANALOG, инициализация USB сама это сделала. И, что интересно, в коде, сгенерированном CUBE, я не нашел, где ноги USB как-то инициализируются. Такое ощущение, что они настраиваются аппаратно при инициализации USB.

 

Quote

о у него при перезапуске эта подтяжка вообще может моргать на миллисекунды и USB-хост будет просто проигнорировать такое "отключение".

Эксперимент показал, что 1 микросекундной задержки достаточно. Хотя скорее всего до возврата ноги D+  в нужное состояние есть еще задержка, но я не измерял.

Что интересно, слышен только звук отключения устройства, звук подключения не запускается. Но при этом все работает. Оба звука слышны лишь тогда, когда задержка превышает 400 мсек.

Пойду разбираться с чтением имени устройства.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 hours ago, Сергей Борщ said:

Скачанный оттуда пример выдает только COM1.

 

7 hours ago, AlexandrY said:

Вот мой проект запускателя терминалоа по VID и PID. - https://github.com/Indemsys/VCOM_Terminal_opener

Ваш проект уже при загрузке выдал кучу ошибок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, -=Женек=- сказал:

Эксперимент показал, что 1 микросекундной задержки достаточно. Хотя скорее всего до возврата ноги D+  в нужное состояние есть еще задержка, но я не измерял.

Что интересно, слышен только звук отключения устройства, звук подключения не запускается. Но при этом все работает. Оба звука слышны лишь тогда, когда задержка превышает 400 мсек.

Ни за что не поверю что у вас ПО рестартует за 1мкс. Обманываете.  :negative:

Если делать так как Вы - методом тыка, то будет так: сегодня работает, завтра - нет (потому что добавились какие-то новые драйвера или устройства или поменялась винда (или другой USB-хост)). Надо начинать с чтения документации. Там должно быть минимально-допустимое время отключения гарантированно обнаруживаемое хостом. Ну или ставить не менее 0.5...1 сек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я наверное акцент неверно поставил.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, jcxz сказал:

Там должно быть минимально-допустимое время отключения гарантированно обнаруживаемое хостом. Ну или ставить не менее 0.5...1 сек.

Это же только для отладки, чтобы при перезаливке прошивки не передёргивать устройство. В обычной жизни эта задержка не нужна. Поэтому, если работает на столе у программиста, то задержка правильная :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, -=Женек=- сказал:

Скачанный оттуда пример выдает только COM1.

Тогда вот: https://github.com/qextserialport/qextserialport/blob/master/src/qextserialenumerator_win.cpp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Сергей Борщ said:

А вы сами это запускали?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут другой вопрос еще родился. Никогда не приходилось работать  с конструкцией try/catch.

А сейчас потребовалось - когда я отключаю устройство - вылазит ошибка EInOutError - причем выдается пачками, приходится вырубать через диспетчер задач.

 

GXAny8XY.png

Вот что я попытался сделать

try
{
ApdComPort1->PutBlock(DataOut,29);

}

catch (EInOutError &e)
{
	ExceptionLabel->Caption->Text="ERROR";
	return;
}

ошибка не ловится.

Что не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 минут назад, -=Женек=- сказал:

А вы сами это запускали?

Да, запускал. Это код библиотеки для qt, соответственно запускал я его в проекте qt. Но вам же была нужна идея, как получить список портов, а идею из этого кода вытащить можно и без qt.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 минут назад, Сергей Борщ сказал:

Да, запускал. Это код библиотеки для qt, соответственно запускал я его в проекте qt.

Сергей, а чем этот QextSerialPort лучше стандартного QSerialPort?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, -=Женек=- said:

ошибка не ловится.

Что не так?

Потому что в AsyncPro ошибки возникают в других потоках.
А вы пытаетесь ловить их в потоке главного окна. Это так не работает.
 
И вообще AsyncPro самый глючный компонент Com порта под embarcadero.
Он создавался еще под  win 3.11, когда модемы максимум работали на 9600.
AsyncPro даже 100 мегабит не тянет.  
Выкидывайте уже его. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...