Не удается открыть COM1 из приложения, запущенного при запуске - PullRequest
8 голосов
/ 20 ноября 2011

Я использую WinLIRC с ИК-приемником, подключенным к последовательному порту COM1 в Windows 7 x64. WinLIRC добавляется в папку «Автозагрузка» («Пуск»> «Все приложения»> «Автозагрузка»), поэтому она запускается при каждом входе в систему. Очень часто (но не всегда) появляются сообщения об ошибках инициализации от WinLIRC, которые продолжаются в течение некоторого времени. время (пара минут), если я повторяю инициализацию, а после некоторых попыток она инициализируется правильно и работает нормально. Если я удаляю его из автозагрузки и запускаю вручную в любой другой момент, он запускается без ошибок.

Я скачал WinLIRC исходники и добавил MessageBox звонки тут и там, чтобы я мог видеть, что происходит во время инициализации, и обнаружил, что CreateFile вызов не удался:

if((hPort=CreateFile(
    settings.port,GENERIC_READ | GENERIC_WRITE,
    0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0))==INVALID_HANDLE_VALUE)
{
    char buffer[256];
    sprintf_s(buffer, "CreateFile(%s) failed with %d", settings.port, GetLastError());
    MessageBox(NULL, buffer, "debug", MB_OK);
    hPort=NULL;
    return false;
}

Я вижу сообщение о том, что «CreateFile (COM1) завершился ошибкой с 5», а 5 - это код ошибки «Доступ запрещен» согласно этой ссылке .

Таким образом, вопрос в том, почему открытие COM-порта может завершиться с такой ошибкой сразу после загрузки Windows и обычно происходит через несколько секунд или минут?

Обновление : COM-порт настоящий.

Update2 : относительно другого приложения, открывающего последовательный порт до WinLIRC. Я сделал следующее: я поместил Process Explorer в папку «Автозагрузка», чтобы он также запускался при входе в систему, а затем перезагружался. Как только запустился проводник процессов, я запустил диалог «Find Handle or Dll», добавил «Serial0» к входу и нажал «Search». К этому моменту WinLIRC уже показывал окно с сообщением «CreateFile (COM1) завершился неудачно с 5». Затем я дождался окончания поиска в проводнике процессов, увидел, что он ничего не нашел, затем попытался повторно инициализировать WinLIRC, и снова произошел сбой. Поэтому я предполагаю, что это не тот случай, когда последовательный порт открывается другим приложением. Если кто-нибудь может предложить лучший способ проверить это, я с радостью перепроверю.

Когда я выполняю поиск «Serial0» в проводнике процессов во время работы WinLIRC, он находит процесс winlirc.exe, поэтому он выглядит как правильный термин для поиска.

Update3 : относительно драйвера последовательной мыши. В диспетчере устройств его нет в списке, поэтому я не смог его там отключить, однако нашел эту инструкцию по отключению службы sermouse, и это не помогло.

Update4 : еще одна вещь, которую я забыл упомянуть. Это происходит, только если я вхожу в систему вскоре после загрузки ПК. Если я оставлю окна на экране входа в систему на несколько минут и войду позже, WinLIRC всегда инициализируется без проблем.

Update5 : К сожалению, у меня нет доступа к компьютеру, на котором воспроизводилась эта проблема, поэтому я больше не могу экспериментировать.

Ответы [ 2 ]

1 голос
/ 24 июня 2013

Вот некоторые ссылки, которые нужно посетить, прежде чем погрузиться в волшебный мир последовательного программирования в Windows :)

Подробное описание последовательного программирования в Windows:

http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c5425/Serial-Communication-in-Windows.htm

немного устарел (сайт утверждает, что 1999-2003, так что да, он устарел), но абсолютно полезен:

http://www.flounder.com/serial.htm

1 голос
/ 23 июня 2013

Требуется время для инициализации порта. Ваше приложение будет работать абсолютно нормально на Windows XP. Последовательные порты Windows7 являются виртуальными.

Вы можете запустить небольшой код и проверить его использование System.IO.Ports;

    private void Form1_Load(object sender, EventArgs e)
    {

        string[] ports = System.IO.Ports.SerialPort.GetPortNames();
        comboBox1.Items.Add("None");
        foreach (string port in ports)
            comboBox1.Items.Add(port);
        comboBox1.SelectedIndex = 0;

    }

Это вернет вам список последовательных портов. Проверьте его статус и отобразите в окне сообщения. Сделайте этот код и запустите при запуске. Вы получите основную причину.

...