Я так устаю бороться с этим каждый раз. ПК, о которых идет речь, это промышленные сенсорные модели, которые никогда не должны меняться. Это 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 часов, когда это произойдет, когда мы будем бить головой о стену.
См. Ответы Hans Passant [здесь] (http://stackoverflow.com/a/7220569) и [здесь] (http://stackoverflow.com/a/7349199) – HebeleHododo
@HebeleHododo Я видел тех, кто раньше, но не вижу, насколько это важно в этом случае. – topshot
Правильный совет просто не имеет особого отношения к тому, что здесь по теме, поговорите с вашим руководителем об этом. Просто предохраняйте себя от столь распространенной ошибки, которую сделает технология, когда он начнет возиться с оборудованием. В VB.NET используйте «Проект»> «Свойства»> вкладка «Приложение»> отметьте флажок «Сделать одно экземплярное приложение». –