VB.NET 2005, последовательный порт, устранение проблемы, Windows CE - PullRequest
0 голосов
/ 12 апреля 2011

Я пишу программу для Windows CE, которая должна работать с последовательными портами. Я использую объект System.IO.Ports.SerialPort. Все работает хорошо, но когда я закрываю программу и открываю ее снова, я получаю сообщение об ошибке: Порт используется! В конце я пишу:

port.close()
port.dispose()

И если я добавлю это:

System.GC.collect() 

.. чем все начинает работать

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

Может кто-нибудь помочь, пожалуйста?

Ответы [ 3 ]

1 голос
/ 12 апреля 2011

Здесь есть несколько потенциальных возможностей.Во-первых, просто потому, что вы вызываете Close, это не означает, что порт физически освобожден - это верно даже для C. Это зависит от состояния UART и от того, как был написан фактический драйвер.Может потребоваться время от звонка на Close до фактического драйвера, освобождающего порт.Это, я полагаю, то, что вы на самом деле видите, потому что вы фактически вручную вызываете close, а не ждете, когда Finalizer уничтожит ваш экземпляр Port и неявно закроет его - это займет еще больше времени.это предполагает, что ваш вызов Close действительно выполняется.Если это не так, то вам нужно понять, как финализация объекта работает в управляемом коде.Это не имеет ничего общего с ООП, оно имеет отношение к управлению памятью.Когда объект выходит из области видимости и у него больше нет корней (ссылок), он становится доступным для сбора, но это не означает, что он немедленно освобождается.Фактически, может пройти некоторое время, прежде чем финализатор запустится, особенно если приложение продолжает работать.

0 голосов
/ 12 апреля 2011

Как долго вы ждете между закрытием и открытием? Согласно MSDN :

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

0 голосов
/ 12 апреля 2011

Может случиться так, что объект, которому принадлежит объект порта, не удален или все еще поддерживает ссылку. Это объясняет, почему после system.gc.collect () это работает.

...