|
2 / 2 / 0
Регистрация: 20.05.2021
Сообщений: 150
|
|
Работа с COM портом после ресета удаленного устройства16.09.2022, 09:24. Показов 2393. Ответов 36
Работаю из приложения с удаленным устройством через UART интерфейс АТ-командами.
Открываю порт и запускаю в приложении поток чтения COM порта. Иногда устройству надо подавать команду программного ресета. Но если я после таймаута пытаюсь подать АТ-команду или переоткрыть COM порт, нарываюсь на исключение: System.IO.IOException: "Требуемый ресурс занят". Да, я не останавливаю поток чтения: я не анализирую подаваемые команды - это функция устройства. И ни о каком ресете удаленного устройства приложение не знает. Но если я в подобной манере работаю через терминальную программу, никаких исключений не происходит! Она продолжает работать после истечения таймаута как будто ресета устройства и не было. Как это организовать в моем приложении? Я что: должен все время мониторить ресурс: открыт порт или нет и автоматически его переоткрывать когда он будет доступен? Что-то мне не очень это нравится. Сомневаюсь, что терминальная программа так устроена.
0
|
|
| 16.09.2022, 09:24 | |
|
Ответы с готовыми решениями:
36
После ресета не работает Wi-Fi Пропад звук в Debian8 после ресета Странное поведение 8 меги после ресета |
|
2 / 2 / 0
Регистрация: 20.05.2021
Сообщений: 150
|
||
| 20.09.2022, 12:56 [ТС] | ||
|
Но, если я просто открываю порт, подаю АТ, получая ОК и закрываю-открываю, все открывается.
Если я после ОК подаю еще команду ресета и жду 40 сек, а потом закрыть-открыть порт, то не открывается. Хотя на сторонней терминальной программе уже через 35 секунд продолжает общаться. Значит, проблемы у меня в приложении. Добавлено через 2 минуты Попробовать можно, но не понимая причин нештатного поведения стремно: у меня эта процедура должна работать в многократно. Можно нарваться на всякие виндовые фокусы с ресурсами. Самое непонятное: причина такого поведения.
0
|
||
|
|
||
| 20.09.2022, 13:02 | ||
|
Штатное поведение оно в WinAPI. Берите и пользуйтесь:
А SerialPort это надстройка над ним. И вовсе не безгрешная: If you *must* use .NET System.IO.Ports.SerialPort И почему вы думаете, что в стороннем терминале не предусмотрена обработка нештатных ситуаций?
0
|
||
|
2 / 2 / 0
Регистрация: 20.05.2021
Сообщений: 150
|
||
| 20.09.2022, 14:33 [ТС] | ||
|
Ведь даже, если я обхожу исключение, работоспособность порта я восстановить никак не могу. Но разве что пересоздать этот объект заново. Но это уже само по себе - нештатная ситуация.
0
|
||
| 20.09.2022, 15:07 | ||
|
0
|
||
|
|
|||
| 20.09.2022, 15:09 | |||
|
Эта обёртка не рассчитана на то, что порт физически удалят из системы. Что при этом происходит, можно посмотреть в исходниках .Net. По самой ситуации спрашивали на форумах Microsoft: Virtual Serial Port from USB device disconnect reconnect then can't open port.
0
|
|||
|
2 / 2 / 0
Регистрация: 20.05.2021
Сообщений: 150
|
|
| 21.09.2022, 08:02 [ТС] | |
|
Коллеги, к сожалению, пересоздание порта после ресета не решает проблемы: та же ругалка при его открытии "Требуемый ресурс занят".
Очень печально. И непонятно, что ему не хватает. Пробовал передергивать питание устройства после ресета и тогда пересоздать порт. Хрен тебе! Все равно требуемый ресурс занят, и порт не открывается, блин! Но порт появляется в диспетчере устройств с тем же именем.
0
|
|
|
2 / 2 / 0
Регистрация: 20.05.2021
Сообщений: 150
|
|
| 21.09.2022, 08:20 [ТС] | |
|
Rius, пока не пробовал.
Есть еще решение со stackoverflow помещением процедур COM порта в отдельный процесс, чтобы хандлеры порта принадлежали ему, и каждый раз пересоздавать этот процесс. Будем посмотреть...
0
|
|
|
2 / 2 / 0
Регистрация: 20.05.2021
Сообщений: 150
|
||||||
| 21.09.2022, 15:17 [ТС] | ||||||
|
Попробовал Ваш пример с кодом создания и работы порта в отдельной задаче.
С тем же неуспехом :-( Картина никак не меняется: в задаче после ресета порт сначала исчезает потом вроде как проявляется по фидбэкам от USB. Но несмотря на переподключение, порт реально не открыт и вызывает на каждом следующем проходе по записи в порт исключение. В обработчике исключения он видит, что соединение установлено по фидбэкам, и шурует дальше в цикле. Но поскольку исключения перехватываются, то падения не происходит, просто обмена нет: порт реально закрыт. Вот этот чуток модифицированный цикл обмена из Вашего примера. Я просто вставил секундную задержку внутри цикла и по счетчику секунд отправляю нужные команды в порт. Вначале подаются команды АТ чтобы убедиться в наличии ответа. Потом команда ресета с паузой в 40 секунд перед следующей командой АТ, которая подается дважды на всякий случай. Но все они остаются без ответа.
Какая хрень у него захвачена - хз.
0
|
||||||
|
|
||||||
| 21.09.2022, 15:51 | ||||||
|
Вот так лучше.
0
|
||||||
|
2 / 2 / 0
Регистрация: 20.05.2021
Сообщений: 150
|
||
| 21.09.2022, 16:17 [ТС] | ||
|
В диспетчере устройства порт подключения значится как модем. Ему присвоен COM порт. USB\VID_1BC7&PID_1201&REV_0318&MI_05 USB\VID_1BC7&PID_1201&MI_05
1
|
||
|
2 / 2 / 0
Регистрация: 20.05.2021
Сообщений: 150
|
|
| 22.09.2022, 13:18 [ТС] | |
|
Попробовал: ничего не меняется.
После восстановления соединения связи нет. Тоже самое когда я просто передергиваю питание модема. Только полный рестарт приложения возобновляет связь. Где-то не так глубоко "спрятался" некий ресурс, который нужен порту и остается недоступен. Все манипуляции со сборщиком мусора не освобождают его. Узнать бы как зовут... Добавлено через 5 часов 30 минут Rius Сделал из Вашего примерчика диалоговую программку (не автомат, а передача из поля ввода). Запустил в двух экземплярах и нормально пообщался через виртуальный мостик COM-COM. Выключение обмена на одном из окон не ведет к падению соединения и при восстановлении я получаю все что недополучил за время паузы. Перезапуск одного из окошек тоже нормально восстанавливает обмен! Т.е. аппаратура UARTа работает корректно в таких ситуациях. А аппаратура USB-СOM дурит! Кривая программная поддержка. И видимо пока не лечится.
0
|
|
|
|
|
| 22.09.2022, 13:20 | |
|
Попробуйте с каким-нибудь другим адаптером usb-uart.
Есть подозрение, что драйвер этого модема не умеет корректно отключаться при физическом удалении открытого порта. Ещё можно посмотреть логи usb и uart через сниффер. Как происходит переподключение в терминале.
0
|
|
|
2 / 2 / 0
Регистрация: 20.05.2021
Сообщений: 150
|
|
| 23.09.2022, 07:38 [ТС] | |
|
Не могу согласиться: работаю через стороннюю терминальную программу и все ОК. Ничего не падает, после ресета продолжает работать. Есть еще одна терминальная программа, похоже написанная на Java. Там тоже нет таких проблем.
Подозреваю: проблема в дотнетовских библиотеках. На компе есть старенький Borland C++Builder. У него в примерах есть терминальный чат. Попробую его приспособить и посмотреть поведение.
0
|
|
| 23.09.2022, 07:38 | |
|
Gigabyte ga-965p после ресета пропадает изображение При перезагрузке комп виснет на этапе завершения работы. После ресета сбрасываются настройки БИОС Bluetooth получение удаленного устройства Проблема получения звука с удалённого устройства Работа с Com-портом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни
1. Механизм отложенного высвобождения фосфора
Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ
Реализована разная скорость. . .
|
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2.
Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
|
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её.
Всё это стресс конечно. Почему?. . .
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|