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:
Nach Systemänderungen durch einen Lösungsvorschläg wurde immer ein Neustart durchgeführt um auf nummer sicher zu gehen
RtsEnable = true und dann RtsEnable = false (aus einem VB.NET-Forum)
In der boot.ini von Windows "/fastdetect:com1" bzw. "/fastdetect:com3" eingetragen und neugestartet
Verwendung von verschiedenen Konstruktoren
if (serPor.IsOpen) serPor.Close(); Zur Neuinitialisierung des Ports
COM-Schnittstelle im BIOS von "auto" zu "COM1" bzw. danach zu "COM3" umgestellt
Mit Zählschleife COM1 bis (i know) COM6 durchgelaufen (Es gab natürlich nur COM1) 😁
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!
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
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!
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
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.
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 😉
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
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
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++
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.
Hallo svenson,
danke erstmal für deine Antwort.
Leider muß ich Dir widersprechen.
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.
Ich werde natürlich die in den verlinkten Threads aufgeführten Lösungsvorschläge mal ausprobieren und meine Erfahrungen hier posten.
Gruß, stefan++