|
-
Jan 31st, 2018, 04:17 AM
#1
Thread Starter
New Member
How detect/identify the serial port where my device is connected automatically?
Hello!
I am programming a windows form that will communicate with a microcontroller. After the winform is loaded, it should automatically detect the comport where the microcontroller is connected.
What I am doing is:
- Get the names of the available ports
- With a look through these names:
- assign the port name to the seiral port instance of the form
- send the detection command
- wait for some time
- check if some text has been received
- compare the received message to the odentication message
- if it the right one break the loop and return the reult, if not continue.
Below is the code of the function. I am using thread.sleep method. But the function is not working and I don't detect the board when it is there.
Can You tell me what is wrong with the function? Is the time delay blocking the reception? how should I ameliorate it?
This function is excuted at the beginning after loading the form. If I don't find the port, nothing can go forward. On the other side, there are no other threads I have to take into account at that stage of the excution. I thought about the DatarRceived Event, but it does not make sense at this stage, it will be activated after the right port has been detected. Please let me know what you think
thank you!
PS: Now I can connect manually from the GUI if the automatic connect does not workl´. But the main goal at this point is to do it automatically.
Code:
' FUNCTION TO FIND OUT THE COM PORT OF THE XMC
' SEND THE USER COMMAND TO ALL AVAILABLE COM PORTS TILL THE RETURN MESSAGE IS RECOGNIZED
Public Function connect(testport As SerialPort, recognizeText As String, userCommand As String) As Boolean
Dim intReturnASCII As Integer = 0
Dim charReturnValue = Chr(intReturnASCII)
Dim returnMessage As String = ""
Dim count As Integer = 0
Dim ports As String() = IO.Ports.SerialPort.GetPortNames
If testport.IsOpen Then
testport.Close()
End If
Try
' LOOP THROUGH THE PORTS
For Each newport As String In ports
testport.PortName = newport
testport.Open()
'SEND COMMAND
testport.Write(STX & userCommand & ETX)
Thread.Sleep(200) ' stop the userform and wait for the reception of the response
count = testport.BytesToRead
While count > 0
intReturnASCII = testport.ReadByte
returnMessage = returnMessage + Convert.ToChar(intReturnASCII)
count -= 1
End While
testport.Close()
XMCPort = newport ' Danach instantiate the serial port publicly with port name , is true instantiate
If returnMessage.Contains(recognizeText) Then
Return True
End If
Next
Return False
Catch ex As Exception
Return False
End Try
count = 0
returnMessage = ""
End Function
-
Feb 1st, 2018, 05:04 PM
#2
Re: How detect/identify the serial port where my device is connected automatically?
Since you've gotten no replies yet, I assume this is via USB and wonder if it modifies the virtual com port name once plugged in (i.e., check in Device Manager)? If so, something like this should work and you won't have to poll each com port.
Code:
Public Function findComDevice(ByVal PartialName As String) As String
Try
Dim moReturn As Management.ManagementObjectCollection
Dim moSearch As Management.ManagementObjectSearcher
Dim mo As Management.ManagementObject
moSearch = New Management.ManagementObjectSearcher("Select * from Win32_PnPEntity")
moReturn = moSearch.Get
For Each mo In moReturn
If IsNothing(mo.Properties.Item("Name").Value) Then Continue For
If CStr(mo.Properties.Item("Name").Value).ToUpper.Contains(PartialName.ToUpper) Then
'returns something like: "Prolific USB-to-Serial Comm Port (COM17)"
Dim IPRegEx As Regex = New Regex("(?<=\().*?(?=\))")
Return IPRegEx.Match(mo.Properties.Item("Name").Value.ToString).Value
End If
Next
Return Nothing
Catch ex As Exception
Messagebox.Show(ex.ToString)
Return Nothing
End Try
End Function
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|