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

Virtual COM Port - STM32F407 - проверить открыт ли порт?

Привет!

Использую USB OTG на плате F4-Discovery в режиме виртуального COM порта ( https://stm32f4-discovery.net/2014/08/library-24-virtual-com-port-vcp-stm32f4xx/ )

Если попытаться что-то передать в сторону ПК, когда COM порт закрыт - программа зависает на записи в буфер.

Вопрос: есть ли варианты убрать эту блокировку? Или только на RTOS переходить?

Изменено пользователем #Eugene

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


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

1 час назад, #Eugene сказал:

Привет!

Использую USB OTG на плате F4-Discovery в режиме виртуального COM порта ( https://stm32f4-discovery.net/2014/08/library-24-virtual-com-port-vcp-stm32f4xx/ )

Если попытаться что-то передать в сторону ПК, когда COM порт закрыт - программа зависает на записи в буфер.

Вопрос: есть ли варианты убрать эту блокировку? Или только на RTOS переходить?

Вариант только один: изучать те исходники организующие этот USB-CDC, которые вы где-то нарыли. Как видно - вы совсем не понимаете их работы...

И какой смысл что-то передавать в закрытый COM-порт??? Это то же самое, что пытаться звонить и что-то говорить на выключенный телефон.

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


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

jcxz, Что значит зачем? Это нормальная ситуация, которая встречается на практике и этот случай нужно правильно обработать.

В библиотеке от ST эта ситуация приводит к блокировке на записи в буфер.

Вопрос в том - как именно поступить в этом случае.

Изменено пользователем #Eugene

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


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

Так по той же ссылке указан TM_USB_VCP_GetStatus который может использоваться для определения подключения к компьютеру.

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


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

8 minutes ago, Segment said:

Так по той же ссылке указан TM_USB_VCP_GetStatus который может использоваться для определения подключения к компьютеру.

Подключение к компьютеру и открытый порт эт разные вещи. 
Реально неожиданное закрытие порта вызывает некоторые неудобства приводящие к необходимости переинициализации всего стека USB или как минимум очередей сообщений.
Для асинхронной ловли событий закрытия порта надо следить за сообщением SET_CONTROL_LINE_STATE а в том сообщении за флагом DTE_PRESENCE_CHECK.
Правда не во всех обстоятельствах он покажет открытие порта. Но тут можно ориентироваться по факту прихода данных. 
И естественно нужна RTOS чтобы сообщение SET_CONTROL_LINE_STATE ловилось в самом приоритетном потоке. 

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


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

57 minutes ago, AlexandrY said:

Подключение к компьютеру и открытый порт эт разные вещи. 
Реально неожиданное закрытие порта вызывает некоторые неудобства приводящие к необходимости переинициализации всего стека USB или как минимум очередей сообщений.
Для асинхронной ловли событий закрытия порта надо следить за сообщением SET_CONTROL_LINE_STATE а в том сообщении за флагом DTE_PRESENCE_CHECK.
Правда не во всех обстоятельствах он покажет открытие порта. Но тут можно ориентироваться по факту прихода данных. 
И естественно нужна RTOS чтобы сообщение SET_CONTROL_LINE_STATE ловилось в самом приоритетном потоке. 

Понял, спасибо! 

Неожиданная особенность.

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


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

3 часа назад, #Eugene сказал:

jcxz, Что значит зачем? Это нормальная ситуация, которая встречается на практике и этот случай нужно правильно обработать.

В библиотеке от ST эта ситуация приводит к блокировке на записи в буфер.

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

 

PS: Такие "нормальные ситуации" нормальны только для кубокодерства....  :unknw:

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


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

1 hour ago, jcxz said:

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

 

PS: Такие "нормальные ситуации" нормальны только для кубокодерства....  :unknw:

Товарищ, вы не в первый раз даёте бестолковые ответы.

Сейчас зачем-то про кубодерство упомянули, хотя CubeMX я никогда не использовал. Впрочем - можно и кубом пользоваться, но проблем там придется решать гораздо больше.

Конечно, при работе с вашим устройством не возникнет ситуации, когда пользователь закроет COM порт во время передачи данных от устройства на ПК (это сарказм, если не догадались).

 

Кстати вариант USB VCP по приведенной в первом посте ссылке - вполне стабильно работает "из коробки", чего не скажешь про CubeMX и версию библиотеки от 2018 года с сайта ST.

Изменено пользователем #Eugene

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


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

1 hour ago, #Eugene said:

Кстати вариант USB VCP по приведенной в первом посте ссылке - вполне стабильно работает "из коробки", чего не скажешь про CubeMX и версию библиотеки от 2018 года с сайта ST.

Очень хороший стек USB у ThreadX.
Там есть специальный callback , вызываемый при изменении состояния порта. Причем на каждый интерфейс в композитном дивайсе свой.

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


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

17 minutes ago, AlexandrY said:

Очень хороший стек USB у ThreadX.

А ThreadX у Renesas, да живет он вечно!

У Kinetis раньше был хороший стек, но теперь испортился :lol2:

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


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

2 часа назад, #Eugene сказал:

Товарищ, вы не в первый раз даёте бестолковые ответы.

Товарищ, может вы просто бестолково их понимаете?  :unknw:

Цитата

Сейчас зачем-то про кубодерство упомянули, хотя CubeMX я никогда не использовал. Впрочем - можно и кубом пользоваться, но проблем там придется решать гораздо больше.

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

Цитата

Конечно, при работе с вашим устройством не возникнет ситуации, когда пользователь закроет COM порт во время передачи данных от устройства на ПК (это сарказм, если не догадались).

При работе с моим устройством, если пользователь закроет COM-порт хоть во время передачи хоть нет - USB-хост перестанет выполнять OUT- и IN-транзакции по USB-шине в ответ на которые USB-стек на устройстве должен выдавать или принимать данные. Именно, что только в ответ на которые. Потому что USB-девайс сам по своей инициативе ничего на шину передавать не может.

Закрыт или открыт COM-порт на хосте - USB-device должно быть вообще фиолетово. Есть транзакция - он должен на неё ответить.

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

Цитата

Кстати вариант USB VCP по приведенной в первом посте ссылке - вполне стабильно работает "из коробки", чего не скажешь про CubeMX и версию библиотеки от 2018 года с сайта ST.

Вот-вот. Это и есть "кубокодерство". А описание протокола USB наверняка даже не открывали, также как и мануал с описанием USB-периферии своего МК....

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


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

1 час назад, AlexandrY сказал:

Там есть специальный callback , вызываемый при изменении состояния порта. Причем на каждый интерфейс в композитном дивайсе свой.

Если работа стека построена на callback-ах (в том числе и передача/приём данных), то вообще не должно происходить переполнений буферов ни в каких случаях.

 

1 час назад, aaarrr сказал:

У Kinetis раньше был хороший стек, но теперь испортился :lol2:

NXP это вроде теперь тоже Кинетис? Так у LPC17xx в примерах IAR стек остался тот же самый. И он - хороший. :ok:

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


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

17 minutes ago, jcxz said:

NXP это вроде теперь тоже Кинетис? Так у LPC17xx в примерах IAR стек остался тот же самый. И он - хороший. :ok:

То был злой сарказмъ.

 

NXP - это не Кинетис, совсем даже наоборот.

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


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

1 hour ago, aaarrr said:

А ThreadX у Renesas, да живет он вечно!

Да верно. Только надо уточнять всегда - Renesas Synergy или просто Synergy. 
Synergy поддерживает 10 пайпов в отличие от ST у которых только 9.
Поэтому на Synergy можно сделать 3! полнофункциональных VCOM на одном USB интерфейсе.
А ThreadX идет с конфигуратором где любую комбинацию интерфейсов можно назначить на USB 

SSP.thumb.gif.0bf438d92748a86c63a02fa7b8fff407.gif

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


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

1 minute ago, AlexandrY said:

Только надо уточнять всегда - Renesas Synergy или просто Synergy. 

Я ошибся в Имени :dash2:

 

4 minutes ago, AlexandrY said:

А ThreadX идет с конфигуратором где любую комбинацию интерфейсов можно назначить на USB 

Вот ведь как - даже гифку не лень нарезать. Чувствую, забористый струмент.

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


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

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

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

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

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

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

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

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

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

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