2016-12-20 2 views
1

Я так устаю бороться с этим каждый раз. ПК, о которых идет речь, это промышленные сенсорные модели, которые никогда не должны меняться. Это Windows 10, в то время как я полагаю, что это также произошло в Windows 7. Хотя в прошлом иногда эта ошибка касалась эмулированных COM-портов (то есть USB-разъем), в этом случае это настоящий COM-порт, поэтому я не могу просто подключить это в другой, поскольку я использую оба 232 разъема. ПК будет работать отлично в течение нескольких месяцев, а затем в один прекрасный день что-то портится с COM-портом, и мне придется перетасовывать их, пытаясь выяснить, какие из них работают сейчас. Это серьезная боль, когда я должен делать это дистанционно (1000 миль) с помощью технологии, иногда использующей кабели в разных положениях.Как определить, что использует ресурсы последовательного порта, вызывающие отказ доступа?

Чтобы устранить что-нибудь с моей оригинальной программой, я создал очень простой тест приложение следующим образом:

Imports System.IO.Ports 

Public Class Form1 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load 

     Try 
      Dim tempList As List(Of String) = SerialPort.GetPortNames.ToList 
      ListBox1.DataSource = tempList 

     Catch ex As Exception 
      MessageBox.Show(ex.Message) 
     End Try 

    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

     Dim tempPort As New SerialPort 
     tempPort.PortName = "COM1" 

     Try 
      tempPort.Close() 

     Catch ex As Exception 
      MessageBox.Show("Closing error: " & ex.ToString) 
     End Try 

     Try 
      tempPort.Open() 
      MessageBox.Show("COM1 Opened") 

     Catch ex As Exception 
      MessageBox.Show("Open error: " & ex.ToString) 
     End Try 

    End Sub 
End Class 

Даже после свежей перезагрузки, я не получаю ошибку на попытку закрытия, но традиционного доступа если я попытаюсь открыть его. Конечно, он появляется в ListBox1.

System.UnauthorizedAccessException: Доступ к порту 'COM1' равен отрицается. в System.IO.Ports.InternalResources.WinIOError (Int32 errorCode, String str) в System.IO.Ports.SerialStream..ctor (String имя порта, Int32 baudRate, четность четности, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 WriteTimeout, рукопожатие рукопожатие, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace) в System.IO.Ports.SerialPort.Open()

Touchscreens всегда должны быть на COM4 и когда я смотрю на предоставляемой утилите конфигурации, которая всегда появляется. Переход в диспетчер устройств не показывает конфликтов, которые я могу видеть в IRQ или в памяти для COM1. Что мешает этому маленькому тестовому приложению открывать порт на этом ПК после перезагрузки?!?!?

UPDATE: Пока, по крайней мере, она волшебным образом «фиксированный» себя как-то (моя ставка гремлинов). После нескольких часов исследований я снова вернулся, чтобы посмотреть, поможет ли перезагрузка в безопасном режиме, и вот, моя нормальная программа работает! WTH?!?!? Я спросил технику, что он сделал, чтобы исправить это, и он думал, что я сделал что-то, чтобы исправить это. Argh !!! Мне все еще нужно найти ответ, поэтому производственный ПК не будет работать в течение 16 часов, когда это произойдет, когда мы будем бить головой о стену.

+0

См. Ответы Hans Passant [здесь] (http://stackoverflow.com/a/7220569) и [здесь] (http://stackoverflow.com/a/7349199) – HebeleHododo

+0

@HebeleHododo Я видел тех, кто раньше, но не вижу, насколько это важно в этом случае. – topshot

+0

Правильный совет просто не имеет особого отношения к тому, что здесь по теме, поговорите с вашим руководителем об этом. Просто предохраняйте себя от столь распространенной ошибки, которую сделает технология, когда он начнет возиться с оборудованием. В VB.NET используйте «Проект»> «Свойства»> вкладка «Приложение»> отметьте флажок «Сделать одно экземплярное приложение». –

ответ

0

Не совсем ответ (хотя бы), но в следующий раз, когда это произойдет, помимо попытки безопасного режима, я попытаюсь найти серийный дескриптор, используя Process Explorer, как описано в this thread. Это кажется многообещающим.

ОБНОВЛЕНИЕ (10 апр. '17) - наконец-то нашел проблему благодаря ответу Клона (не принятому) в this thread. Иногда Windows идентифицирует устройства с постоянным потоком данных, подключенным к последовательному порту в виде последовательной мыши (например, Microsoft Serial Ballpoint), и пытается установить их, ПРИНИМАЯ КОНТРОЛЬ НА ПОРТ БЕЗ КАКИХ-ЛИБО ПРОЦЕССОВ ИСПОЛЬЗОВАНИЯ. Действительно, Process Explorer ничего не видел с помощью COM1. Решение заключается в отключении (не удалении) устройства с помощью диспетчера устройств под мышами и другими указательными устройствами.

1

Возможно, вы получаете это исключение, потому что вы не ждете после закрытия порта.

От SerialPort.Close документации

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

К сожалению, не существует способа узнать, сколько времени вам нужно подождать. Вы можете начать с 100 мс и идти вверх. Если бы это не беспокоило пользователя, я бы пошел с 500 мс, чтобы быть в безопасности.

В идеале вы бы установили Open порт и Close, когда ваша программа закроется.

+0

Это все еще не актуально. Моя нормальная программа просто проверяет свойство IsOpen, а затем выполняет Open. Я только поместил Close в мою маленькую тестовую программу, чтобы доказать, что порт действительно закрыт, прежде чем пытаться его открыть (и посмотреть, будет ли сообщение «Закрыть»). Я удалю Close из моего тестового приложения, но очень сомневаюсь что изменит что угодно. – topshot

+0

Действительно, попытка только Open сразу после перезагрузки дает тот же результат для COM1. Как и COM4, ​​это то, что использует аппаратное обеспечение сенсорного экрана. Другие порты открыты нормально. – topshot

+0

Хмм, я не знаю. Я оставляю ответ в качестве ссылки, если кто-то хочет ответить на ваш вопрос, они узнают, что это было проверено. Удачи! – HebeleHododo