|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
28.12.2019, 22:26 | #1 |
Пользователь
Регистрация: 20.07.2013
Сообщений: 42
|
Как избавиться от System.ObjectDisposedException при Close-закрытии зависшего порта
Есть приложение, работающее с устройством на микроконтроллере со встроенным ЮСБ.
Устройство подключено к компьютеру и ОС через виртуальный ком-порт. В определенные моменты (например для перевода в бутлоадер) устройству нужно отправлять команду на перезагрузку "sendCommand(bReset)". Так как ЮСБ внутри контроллера, то теряется соединение с устройством, оно как-бы зависает, и не слышит и не отвечает. Есть вариант восстановить соединение с устройством. Для этого надо поменять (освободить), занимаемый устройством, СОМ-порт (обязательно закрыв его). А потом программно Отключить-Задействовать драйвер устройства. Я не стал полностью выкладывать код, слишком много. Упростил перевключение драйвера, на "ручное", чтобы выбросить кучу ненужного. Состряпал коротенький код, в котором моя проблема явно проявляется. Фраемворк нельзя использовать выше 4-го (нужно чтобы программа работала и на ВинХР). И сборку делаю под "Any CPU". Знаю что в последней версии фраемворка, этот баг, с закрытием зависшего порта, Микрософт пофиксил, но не могу использовать этот фраемворк. Еще информация, когда проверяю код в студии, под отладчиком, этот баг не проявляется, валится только когда работаю без студии. Причем не влияет, какую я сделал сборку (дебагерную или релизную). То-есть все-таки как-то можно его избежать. Вопрос, КАК? Как ловится этот баг. Периодически нажимаю на кнопку "button3". Не всегда, но в самый неожиданный момент, на произвольном нажатии кнопки, выскакивает окно с исключением. Вот его данные из журнала событий винды.(оставил самое главное, из-за чего происходит): Это стек: System.ObjectDisposedException в ... в ... в.... System.IO.Ports.SerialStream+EventL oopRunner.WaitForCommEvent() .... Это доп. сведения: System.ObjectDisposedException не обработано Message: Необработанное исключение типа "System.ObjectDisposedException " в mscorlib.dll Дополнительные сведения: Дескриптор SafeHandle был закрыт Перепробовал уже кучу вариантов, и их комбинаций: 1). Таймауты просто дикие задавал почти после каждой операции с портом. 2). GC.SuppressFinalize(serialPort1.Bas eStream) после открытия порта + GC.ReRegisterForFinalize(serialPort 1.BaseStream) перед закрытием порта. 3). при каждом открытии порта, создавать новый экземпляр его класса. 4). Создавал класс-наследник от SerialPort. 5). Выводил нажатие на кнопку в отдельный поток. 6). В файле "App.config", вставлял строку "<legacyUnhandledExceptionPolic y enabled="1"/>" Это помогло, но только для ОС выше ВинХР, на ВинХР, валится. Да и это решение очень "скользкое". Кстати оно натолкнуло на мысль, а можно временно отключить обработчик этого исключения, восстановить порт, а потом опять включить? Код:
Последний раз редактировалось Kuzya69; 28.12.2019 в 22:41. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Зависает форма при закрытии порта | Принтер | C# (си шарп) | 1 | 24.12.2015 15:15 |
Сниффер COM-порта или программное создание виртуального COM-порта | Oleg_Ponomaryov | Общие вопросы C/C++ | 4 | 12.06.2015 09:28 |
Перезапуск зависшего приложения | Val Rubis | Общие вопросы Delphi | 14 | 09.08.2012 07:27 |
Ошибка при запуске: This system does not support fullscreen mode. Choose 'Close' to terminate the application. | afirat | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 07.05.2012 05:45 |
Ошибка Ambiguity between '_fastcall System::operator +(int,const System::Variant &)' and '_fastcall System::opera | Jawner | C++ Builder | 1 | 12.04.2012 09:58 |