Windows: что-то временно захватывает com порты при запуске? - PullRequest
0 голосов
/ 29 апреля 2010

У меня есть приложение WPF / C #, которое запускается как часть группы «Автозагрузка» на компьютере под управлением Windows Embedded Standard. Первое, что делает приложение (в своем статическом методе App ()) - это создание нового объекта SerialPort для COM1. COM1 - это аппаратный последовательный порт, а не виртуальный порт USB или что-то в этом роде.

Моя проблема в том, что при запуске (часто 1 из 12) я получаю исключение: System.UnauthorizedAccessException: доступ к порту 'COM1' запрещен.

Нет других приложений, использующих этот порт. Кроме того, когда я перезапускаю приложение после этой ошибки, оно прекрасно захватывает порт. Это как если бы com-порт не был готов / настроен для моего приложения иногда.

Я не в курсе этого! Любое понимание приветствуется!

ОБНОВЛЕНИЕ: я добавил вызов SerialPort.GetPortNames () и распечатал все доступные порты, прежде чем пытаться открыть порт. В случае неудачи COM1 действительно ТАМ! Итак, порт не готов. Похоже, что-то в Windows фактически временно захватывает порт и блокирует меня.

1 Ответ

1 голос
/ 30 апреля 2010

Некоторые респонденты в Microsoft, похоже, считают, что ядро ​​временно захватывает COM1 при запуске по причинам отладки. Говорят, что лучший подход - это обойти эту проблему ... поймать исключение и повторить попытку. Boooo.

Я изменил свой код, чтобы повторить попытку открытия порта несколько раз, прежде чем сдаться, что, похоже, решает эту проблему.

Старый код:

_port = new SerialPort(port, 9600, Parity.None, 8, StopBits.One);                                 
_port.Open();   // This can throw an exception

Новый код:

const int PORT_OPEN_MAX_ATTEMPTS = 10;
bool portOpened = false;
int portOpenAttempts = 0;                     

            _port = new SerialPort(port, 9600, Parity.None, 8, StopBits.One);                      

            while (!portOpened)
            {
                try
                {
                    _port.Open();
                    portOpened = true;      // Only get here if no exception
                }

                catch (UnauthorizedAccessException ex)
                {
                    // Log, close, then try again
                    if (portOpenAttempts++ < PORT_OPEN_MAX_ATTEMPTS)
                    {                       
                        _logger.Debug("Port UnauthorizedAccessException. Attempt - " + portOpenAttempts);

                        Thread.Sleep(100);
                        _port.Close();
                    }

                    else
                    {
                        throw(ex);
                    }
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...