Serielle Schnittstelle automatisch erkennen lassen.



  • Wenn es auf dem Rechner mehrere Serielle Schnittstellen gibt, ist es möglich eine besetzte Schnittstelle automatisch erkennen? Ich kann alle existierende ComPorts abfragen mit

    array<String^>^ serialPorts;
    SerialPort port;
    serialPorts=port.GetPortNames();
    

    noch vor dem Verbindungsaufbau.
    Dann kann man ja auf jeden Port ein Prüfbyte senden, und somit einen richtigen Port ermitteln. Das geht aber nicht, weil die Eigenschaft

    port.PortName
    

    falsches Wert führt und darum stützt dann die Methode

    port.Open()
    

    ab.
    Ist es möglich dieses Probmlem zu umgehen?
    Gruss Yan



  • falsches Wert führt und darum stützt dann die Methode ... ab.

    Ich nehme stark an, dass es eine Exception gibt, welche genauere Informationen über die Umstände enthält.

    Probier mal so zu mehr informationen zu kommen:

    #include "stdafx.h"
    
    using namespace System;
    using namespace System::Diagnostics;
    using namespace System::IO::Ports;
    
    int main(array<System::String ^> ^args)
    {
    	array<String^>^ names = SerialPort::GetPortNames();
    	for each (String^ name in names)
    	{
    		try
    		{
    			SerialPort port;
    			port.PortName = name;
    			port.Open();
    		}
    		catch (Exception^ ex)
    		{
    			Debug::WriteLine(ex);
    		}
    	}
    
        return 0;
    }
    


  • Es hat geklappt!
    Vielen Dank!

    Noch eine Frage.
    Zum Beispiel Serielle Anschluße sind nicht belegt. Dann kann man immmer noch in den Ausgangspuffer noch schreiben. Aber wenn ich versuche den Einganspuffer zu lesen stürtzt das Programm ab. Kann ich irgendwie das abfangen?



  • Was meinst Du mit Abstürzen?
    Wird ev. einfach eine Exception geworfen?
    Dann wäre obiger Ansatz (try- catch) zu wählen.

    Simon



  • Ich mache es mit dem Exception-Handler. Ich habe die Lese-Fuktion in try-Blockplatziert, trotzdem das Programm stürtz ab. Wie kann ich es lösen?

    [cpp]private: System::String^ OeffneVerbindung()
    	{
    		buff[0]=0xCC;
    		String^ str;
    		SerialPort port; 
    		bool friamat_angeschlossen= false;
    
    		/*String^ bt;*/
    
    		for each (String^ name in serialPorts) 
    			{ 
    			 try //Ist ein SerialPort überhaut frei?
    				{ 
    
    				port.PortName = name; 
    				port.Open();
    
    					port.Write(buff,0,1);
    
    					try{
    						port.Read(buff,0,1);
    					}
    					catch(InvalidOperationException ^iex)
    					{
    						str="Serielle Schnittstelle ist nicht belegt";
    					}
    
    					if  (buff[0]==  0x3C || 0x33 || 0xC3 
    							|| 0x39 || 0x93 || 0x99 
    							|| 0x96 || 0x66 || 0x6C
    							|| 0x69 || 0xC9 || 0xC6
    							|| 0x36 || 0x63)
    							{
    								friamat_angeschlossen=true;
    								str=name;
    								return str;
    							}
    
    				}
    
    			catch (Exception^ ex) 
    					{ 
    
    					//Debug::WriteLine(ex); 
    					}
    		}
    
    	return str;
    	}[/cpp]
    


  • Lies in der Doku nach.
    Dort steht alles.


Anmelden zum Antworten