Jump to content

  • Log In with Google      Sign In   
  • Create Account

[.net] System.IO.Ports check to see which ports are available?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 aleisterbukowski   Members   -  Reputation: 146

Like
0Likes
Like

Posted 24 February 2009 - 06:42 PM

I would like to find out a clever way of finding which ports are available. I have finally figured out that my microcontroller is connected to COM 5, or at least is being registered at COM 5 when I use my hyperterminal program I wrote in C#. However, I'm looking more toward a way to see which ports are available for open prior to opening them. I tried SerialPort SP = new SerialPort("COM1"); if(SP.IsOpen) //do stuff else SP = new SerialPort("COM2") if(SP.IsOpen) // do stuff here else etc... However, that can't technically be used until you have successfully opened the port, which means as you open the port SP.Open(); you're going to get an error while you're debugging it, and it's going to stop your program, since COM1 - COM4 doesn't exist. Which means I literally had to do the following on page load over and over until I found that yes I can connect to the program through the microcontroller, but it's trial and error, and I don't like it. SP = new SerialPort("COM1"); test program change to SP = new SerialPort("COM2"); test program change it to do this process until we have successfully come to SP = new SerialPort("COM5"); Sp.Open(); if(SP.IsOpen) MessageBox.Show("Connected successfully!); of course when I actually want to run the program, and use it on another system I'm going to need an algorithm to find which ports are open. My previous methods have not work, so I'm asking a community for some help. Thank you,

Sponsor:

#2 smitty1276   Members   -  Reputation: 560

Like
0Likes
Like

Posted 24 February 2009 - 07:44 PM

I'm confused... why can't you just do:

for (int i=0; i < MAX_PORT_NUM-1; i++)
{
SP = new SerialPort("COM" + i);
try
{
SP.Open(...);
}
catch
{
// That one didn't work...
}
}





#3 aleisterbukowski   Members   -  Reputation: 146

Like
0Likes
Like

Posted 24 February 2009 - 08:14 PM

Quote:
Original post by smitty1276
I'm confused... why can't you just do:
*** Source Snippet Removed ***



for (int i=0; i < 9; i++)
{
SP = new SerialPort("COM" + i);
try
{
SP.Open();
}
catch
{
// That one didn't work...
}
}
if (SP.IsOpen) txtReceiver.AppendText("Connected Successfully to " + SP.PortName.ToString() + " sucessfully. \n\n\n\n" + SP.PortName.ToString() + " is ready to be used\n\n\n\n");
SP.BaudRate = 25;



I have done what you have suggested. I have a terminal/command prompt like textfield that displays how many seconds we've gone since last transmission, what we've sent, etc...

As you can see we check to see if it's opened after we go through the loop and try to open the port.

As it gets to COM5 it should open, and then break, and check the next line of code.

And if it's opened it should say hey, we're open and we're ready for some action.

However that doesn't happen at all.

The only time I got it to work and connected successfully is if I manually connect to COM5 like the following.


SP = new SerialPort("COM5");



then once I checked it was opened it precisely what it should have done if it was opened.
[/source]

#4 Magos   Members   -  Reputation: 218

Like
0Likes
Like

Posted 24 February 2009 - 11:37 PM

First, instead of guessing some random numbers use System.IO.Ports.SerialPort.GetPortNames() to get the available ports.

Second I'm not clear what you're trying to achiveve.
A function like this checks if the port can be opened, as was posted earlier.
If the port is used by another program it fails (throws an exception, exception gets caught, function returns false).
Isn't this what you want?

bool IsPortAvailable(string PortName)
{
try
{
var Port = new System.IO.Ports.SerialPort(PortName);
Port.Close();
return true;
}
catch
{
return false;
}
}


----------------------------------------MagosX.com

#5 aleisterbukowski   Members   -  Reputation: 146

Like
0Likes
Like

Posted 25 February 2009 - 06:06 PM

The code above seems to well see if it can be created and it can, but that's doesn't necessarily mean it can be open.

For instance, i did the following



string[] comPorts = {"COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9" };

for (int i = 0; i < comPorts.Length; i++)
{
if(IsPortOpen(comPorts[i]))
{
cmbPorts.Items.Add(comPorts[i]);
}
}



and your code hasn't been modified at all.

In other words all ports are added to the combobox when only the ports that can successfully be open should be added.

Once you add a Open();

to the port you create you're going to get an error flag and it's going to break while you're debugging it unless it is the port that you can connect to.



[/source]

#6 aleisterbukowski   Members   -  Reputation: 146

Like
0Likes
Like

Posted 25 February 2009 - 07:24 PM

I figured it out.

I didn't realize when I try to open a port I needed to give it a try catch, so when the port doesn't exist, or can't be open I can just catch the error and return instead of having the debugger spit out a non-existing object reference error, or whatever it spit out.

The final code is below

thanks for the help.


private bool IsPortOpen(String portName)
{
SerialPort tempPort;
try
{
tempPort = new SerialPort(portName);
try
{
tempPort.Open();
}
catch
{
return false;
}
tempPort.Close();
return true;
}
catch
{
return false;
}
}



Again thank you! Much help it was looking at it that way.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS