Laden...

Zugriff auf die COM-Schnittstelle löst UnauthorizedAccessException aus

Erstellt von mbk_chilli vor 16 Jahren Letzter Beitrag vor 14 Jahren 19.806 Views
M
mbk_chilli Themenstarter:in
79 Beiträge seit 2007
vor 16 Jahren
Zugriff auf die COM-Schnittstelle löst UnauthorizedAccessException aus

Hallo leutz,

ich bin derzeitig völlig am verzweifeln. Seit Stunden versuche ich erfolglos auf die COM1 Schnittstelle zu zugreifen.

Ein paar vorab Daten:
OS: Microsoft Windows XP Pro SP2
PC: Dell (hoffe das reicht)
User: Lokale Administrative Rechte / Das programm wird auch unter meinem Benutzer ausgeführt (gecheckt durch TaskManager)
Framework: .NET 2.0 (version 2.0.50727.42)

Mein Ziel ist es über den Interface Standard RS232 auf ein RFID-Device zu zugreifen.

try
{
   string com = "COM1";
   SerialPort serPor = new SerialPort(com);
   //SerialPort serPor = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
   serPor.RtsEnable = true;
   serPor.RtsEnable = false;

   if (serPor.IsOpen) serPor.Close();

      serPor.Open();

      if (serPor.IsOpen)
      {
          this.rtb1.Text = "Open";
      }
       else
       {
          this.rtb1.Text = "Close";
       }

        serPor.Close();
}
catch (UnauthorizedAccessException exep)
{
   this.rtb2.Text = this.rtb2.Text + exep.Message + "\r\n";
}
catch (Exception exep2)
{
   this.rtb2.Text = this.rtb2.Text + exep2.Message + "\r\n";
}

Ich habe bereits folgende Lösungsansätze (leider) erfolglos durchgeführt:

  1. Nach Systemänderungen durch einen Lösungsvorschläg wurde immer ein Neustart durchgeführt um auf nummer sicher zu gehen

  2. RtsEnable = true und dann RtsEnable = false (aus einem VB.NET-Forum)

  3. In der boot.ini von Windows "/fastdetect:com1" bzw. "/fastdetect:com3" eingetragen und neugestartet

  4. Verwendung von verschiedenen Konstruktoren

  5. if (serPor.IsOpen) serPor.Close(); Zur Neuinitialisierung des Ports

  6. COM-Schnittstelle im BIOS von "auto" zu "COM1" bzw. danach zu "COM3" umgestellt

  7. Mit Zählschleife COM1 bis (i know) COM6 durchgelaufen (Es gab natürlich nur COM1) 😁

  8. Windows Firewall ausgestellt

Leider endeten ALLE diese "Lösungen" in einer "UnauthorizedAccessException" mit dem direkten Text "Der Zugriff auf den Anschluss COM1 wurde verweigert."

Der Fehler tritt bei der folgenden Codezeile auf:

serPor.Open();

An dem angeschlossenen Gerät kann es nicht liegen, da selbst wenn ich die COM-Schnittstelle nicht belegt habe die Ausnahme ausgelöst wird.

Ich bin für jeden Denk- oder Lösungsansatz total dankbar 😁 😄.

greetz euer mbk_chilli

Die drei Tugenden eines Programmierers:
Faulheit, Ungeduld und Hochmut!

K
124 Beiträge seit 2006
vor 16 Jahren

Hallo mbk_chilli,

Der Zugriff auf den Anschluss COM1 wurde verweigert.

mein erster Tipp: möglicherweise verwendet bereits ein anderes Programm auf deinem Rechner den seriellen Port (z.b. ein Terminalprogramm wie Hyperterminal).

lg
martin

M
mbk_chilli Themenstarter:in
79 Beiträge seit 2007
vor 16 Jahren

Jo, genau so war es Microsoft ActiveSynch hat sich den COM1 reserviert. Hammer gut programmiert muss ich sagen da es ja über die USB-Schnittstelle angeschlossen ist.

naja super dank dir martin.

greetz mbk_chilli

Die drei Tugenden eines Programmierers:
Faulheit, Ungeduld und Hochmut!

T
3 Beiträge seit 2007
vor 16 Jahren

Hallo!

Ich habe hier fast genau das selbe Problem, bekomme auch die UnauthorizedAccessException und mir wird gesagt, daß ich keinen Zugriff auf COM1 habe. Allerdings nur, wenn bei mir das Visual Studio mit der Projektmappe offen ist. Starte ich die Exe-Datei wenn das Projekt geschlossen ist funktioniert alles wunderbar. ComPort.Open() rufe ich im Konstruktor meines Forms auf. Irgendwie verstehe ich die ganze Sache nicht, da es bei einem anderen Projekt mit dem selben Aufbau (also Comport.Open() im Konstruktor aufrufen usw.) keine Probleme gibt.

Ich hoffe ihr habt einen Rat für mich.

vG TitanX

T
3 Beiträge seit 2007
vor 16 Jahren

So, inzwischen geht es, zumindest vorerst 😁

Habe einfach mal alle erstellten Dateien gelöscht und dann das gesamte Projekt neu erstellt. Wo jetzt aber genau der Fehler lag kann ich auch nicht sagen.

S
15 Beiträge seit 2009
vor 14 Jahren

Hi,
ist zwar ein alter Beitrag aber wollte erstmal keinen neuen aufmachen, weil das hier auch mein Problem ist/werden kann.
Hoffe einer Liest sich den noch durch 🤔

Also ich wollte eine Abfrage in mein Programm übernehmen, inder geprüft wird, ob der COM-Port schon von einem anderen Prog belegt ist/benutzt wird.

 
if (serilaPort.Name ..?gerade benutzt?..) //Prüfen ob z.B. COM1 schon benutzt wird
    {
         for(int i=0; i<30000;i++)  //30sec. mit Zählen beschäftigen
             {}
     }
serialPort.Open();
.
..
...

Wollte ich einfügen, weil mein Dienst ebenfalls auf den COM-Port zugreift.
Die sollen sich somit nicht gegenseitig stören, sodern kurz warten (geht das überhaupt mit der for-Schleife?) und dann die Verbindung aufbauen.

Hoffe man kann mir n Tipp geben, wie ich das ganze prüfen kann. Oder wo ich was zu dem Thema finden kann.

Blutige Anfänger habens immer schwer!!!
--> Ich weiß schon was ne Klasse ist 😉

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Shakal,

Teilantwort:

geht das überhaupt mit der for-Schleife?

Grundsätzlich kann man mit einer solchen Schleife schon Zeit verbrauchen, aber die CPU-Last des ausführenden Kerns steigt dadurch unnötig auf 100%. Außerdem hängt die verbrauchte Zeit davon ab, wie schnell der Rechner ist und wie sehr die Schleife vom Compiler (weg-)optimiert wird. Man sollte von solchen Konstruktionen unbedingt die Finger lassen. So unbedingt, dass es deine Schleife in Coding Styles Horror geschafft hat. 😃

Wenn du an dieser Codestelle wirklich sinnvollerweise warten willst, dann verwende Thread.Sleep.

herbivore

T
708 Beiträge seit 2008
vor 14 Jahren

Guten Morgen zusammen,

Der COM-Port liefert immer ziemlich genaue Fehlerbeschreibungen anhand derer man simpel erkennen kann wo das Problem liegt.
Dazu empfehle ich ein einfaches Try-Catch:

 try
            {
                comPort.BaudRate = int.Parse(_baudRate);    //BaudRate
                [...]
                comPort.RtsEnable = _enableRTS;                
                //now open the port
                comPort.Open();
                //display message
                DisplayData(MessageType.Normal, "Port opened at " + DateTime.Now);
                return true;
            }
            catch (Exception ex)
            {
                DisplayData(MessageType.Error, ex.Message);
                return false;
            }

Die Funktion DisplayData tut nichts anderes als die Ausgabe auf einer ListBox auszugeben. Anhand des MessageType (Enum) kannst du festlegen ob es ein Error, eine Ausgabe usw. ist.

So kannst du zum einen ablesen welches Problem besteht und zum anderen könntest du, wie herbivore schon vorschlägt mit Thread.Sleep prüfen ob der Port wirklich belegt ist.

Gruß TriB

S
37 Beiträge seit 2007
vor 14 Jahren
System.UnauthorizedAccessException

Hallo miteinander,

ich habe ebenfalls ein Problem mit dieser UnauthorizedAccessException.
Also, ich kommuniziere mit einem Gerät, welches per USB an einem virtuellen COM Port (FTDI Chip) an den Rechner angeschlossen ist. COM Port ermitteln, öffnen, ansprechen und schließen alles kein Problem.
Jedoch wenn ich die HW im laufenden Betrieb abstecke, kommt diese Exception. Soweit auch noch alles nachvollziehbar, das Gerät ist ja dann nicht mehr am System und somit kann auf diese Resource auch nichtmehr zugegriffen werden. Die Exception abzufangen ist ganz klar, aber wie könnte ich jetzt den Port wieder öffnen, wenn ich die HW wieder angeschloßen habe ohne die SW neustarten zu müssen? In MatLab zum Bsp gibt es ein Handle auf den COM Port, gibt es soetwas auch in .Net? Bzw. kennt jemand eine Umgehungslösung?

Vielen Dank schon mal,

stefan++

S
8.746 Beiträge seit 2005
vor 14 Jahren

Exception abfangen, Port schliessen. Dann solltest du den Port öffnen können, sofern die HW wieder dran ist. Ein Neustart der SW ist nciht notwendig - sofern die Treiber deines virtuellen COM-Ports nicht totale Gülle sind.

S
37 Beiträge seit 2007
vor 14 Jahren

Hallo svenson,

danke erstmal für deine Antwort.
Leider muß ich Dir widersprechen.

  • Exception abfangen ok (in meiner SW weiß ich es sogar früher als der ExceptionHandler/Debugger)
  • Port.Close() nicht ok (UnauthorizedAccessException)
  • Port.Dispose() ok
    Meine Erklärung ist, dass das SerialPort-Objekt durch das Trennen der HW ungültig wird und somit der Zugriff auf die einzelnen Methoden nicht erlaubt ist.
    Nur ändert sich das leider auch nichtmehr, wenn die HW wieder angeschlossen wird. Die HW ist dann ganz normal verfügbar, wird im HW-Manager angezeigt usw., nur kann ich aus der aktuellen SW Sitzung nichtmehr darauf zugreifen ohne eine UnauthorizedAccessException zu erhalten. Ich muß dann erst die SW neustarten. Vielleicht hilft es auch ein neues SerialPort-Objekt zu initalisieren, habe ich noch nicht ausprobiert, allerdings finde ich das wenig elegant, ich weiß ja nicht wie oft ein User letztendlich die HW an und absteckt.

beim Googlen bin ich da über diese Threads gestoßen:

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=140018
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=426766

Gruß, stefan++

achso, zum VCP Treiber, das ist der CDM20600 von FTDI, allerdings denke ich interessiert das die SW wenig, VCP wird vom BS verwaltet, die SW sieht nur einen seriellen Port, ob nun VCP oder real ist der doch wurscht.

S
37 Beiträge seit 2007
vor 14 Jahren

Ich werde natürlich die in den verlinkten Threads aufgeführten Lösungsvorschläge mal ausprobieren und meine Erfahrungen hier posten.

Gruß, stefan++