Getting the list of available serial ports in C++
Question
Monday, March 9, 2009 8:57 PM
How do I get the list of available serial ports in C++? I am able to do it in Visual Basic, but I can seem to do it in C++.
Got RAM?
All replies (13)
Monday, March 9, 2009 11:08 PM ✅Answered
Tuesday, March 10, 2009 12:10 AM ✅Answered
Enumerate registry key HKLM\Hardware\DeviceMap\SerialComm. It is solid, that's what .NET's System.IO.Ports.SerialPort.GetPortNames() uses. Hans Passant.
Monday, March 9, 2009 9:48 PM
Use QueryDosDevice. Serial port names begins with "COM"MSMVP VC++
Monday, March 9, 2009 10:17 PM
How do I use QueryDosDevice? an example please?
Thanks.
Brandon C.
Got RAM?
Monday, March 9, 2009 11:28 PM
I don't think QueryDosDevice is what I'm looking for. All I want to do is find how many COM ports there are, and display them in a ComboBox. Got RAM?
Tuesday, March 10, 2009 1:35 AM
I really don't understand. I just started C++ and I don't know what a Register key is. Got RAM?
Tuesday, March 10, 2009 2:13 AM | 2 votes
Hi, Brandon110
I was interested in the title of your post 'cause I've been there a long time ago.
IMO, the QueryDosDevice() example suggested by Sheng Jiang seems to be one of possible solutions.
(But don't use the sample code as it is 'cause it has a minor bug in it - it assumes that any device name starts with 'com' should be the name of a COM port, which is not always true.)
It's a bit complicated to get the list of physical COM ports and the most popular way of getting it is to rely on the registry information like Hans suggested above.
If you're not familiar with retrieving the registry information, the following straightforward but a bit tedious example can be one of your choices;
CUIntArray arrComPortNo; |
TCHAR szComPort[8]; |
HANDLE hCom = NULL; |
for (int i = 1; i <= _max_COMports_to_iterate; ++i) |
{ |
if (i < 10) wsprintf(szComPort, _T("COM%d"), i); else wsprintf(szComPort, _T("\\\\.\\COM%d"), i); |
hCom = CreateFile(szComPort, |
GENERIC_READ|GENERIC_WRITE, // desired access should be read&write |
0, // COM port must be opened in non-sharing mode |
NULL, // don't care about the security |
OPEN_EXISTING, // IMPORTANT: must use OPEN_EXISTING for a COM port |
0, // usually overlapped but non-overlapped for existance test |
NULL); // always NULL for a general purpose COM port |
if (INVALID_HANDLE_VALUE == hCom) |
{ |
if (ERROR_ACCESS_DENIED == hCom) |
{ // then it exists and currently opened |
arrComPortNo.Add(i); |
} |
} |
else |
{ // COM port exist |
arrComPortNo.Add(i); |
CloseHandle(hCom); |
} |
} |
int nComportsAvailable = arrComPortNo.GetSize(); |
Regards,
Tuesday, March 10, 2009 2:21 AM
Thanks, i appreciate the help. But when I compile it I get 34 errors. Am I missing something?
Error 1 error C2065: 'CUIntArray' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 867
Error 2 error C2146: syntax error : missing ';' before identifier 'arrComPortNo' c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 867
Error 3 error C2065: 'arrComPortNo' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 867
Error 4 error C2065: 'TCHAR' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 868
Error 5 error C2146: syntax error : missing ';' before identifier 'szComPort' c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 868
Error 6 error C2065: 'szComPort' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 868
Error 7 error C2065: 'HANDLE' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 869
Error 8 error C2146: syntax error : missing ';' before identifier 'hCom' c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 869
Error 9 error C2065: 'hCom' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 869
Error 10 error C2065: 'NULL' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 869
Error 11 error C2065: '_max_COMports_to_iterate' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 871
Error 12 error C2065: 'szComPort' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 873
Error 13 error C3861: 'wsprintf': identifier not found c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 873
Error 14 error C3861: '_T': identifier not found c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 873
Error 15 error C2065: 'hCom' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 875
Error 16 error C2065: 'szComPort' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 875
Error 17 error C2065: 'GENERIC_READ' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 876
Error 18 error C2065: 'GENERIC_WRITE' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 876
Error 19 error C2065: 'NULL' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 878
Error 20 error C2065: 'OPEN_EXISTING' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 879
Error 21 error C2065: 'NULL' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 881
Error 22 error C3861: 'CreateFile': identifier not found c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 875
Error 23 error C2065: 'INVALID_HANDLE_VALUE' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 883
Error 24 error C2065: 'hCom' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 883
Error 25 error C2065: 'ERROR_ACCESS_DENIED' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 885
Error 26 error C2065: 'hCom' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 885
Error 27 error C2065: 'arrComPortNo' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 887
Error 28 error C2228: left of '.Add' must have class/struct/union c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 887
Error 29 error C2065: 'arrComPortNo' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 892
Error 30 error C2228: left of '.Add' must have class/struct/union c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 892
Error 31 error C2065: 'hCom' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 893
Error 32 error C3861: 'CloseHandle': identifier not found c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 893
Error 33 error C2065: 'arrComPortNo' : undeclared identifier c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 897
Error 34 error C2228: left of '.GetSize' must have class/struct/union c:\users\brandon\documents\visual studio 2008\projects\mini-sequencer\mini-sequencer\Form1.h 897
Got RAM?
Tuesday, March 10, 2009 2:33 AM
-_-;
Could you tell me what type of project you're working on now?
And the reason that you put the code snippet above in your header file, Form1.h, instead of a cpp file?
You need some headers and libraries for windows programming...not only for MFC classes but also for any windows programming. I think you need to check it out how to build an application program using C/C++ before figuring out how to enumerate the COM ports available.
Good luck, ;)
Tuesday, March 10, 2009 2:43 AM
Duh! :P
I'm actually working on a project for a robot. It creates sequences for the servos and stores them for playback.
I have about 3 years experience with programming, but I just started C++. I'm still getting used to it.
Thanks!
Edit: I put it in a .cpp file and it has 1 error:
Error 1 fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source? c:\Users\Brandon\Documents\Visual Studio 2008\Projects\Mini-Sequencer\Mini-Sequencer\Comports.cpp 37
And when I included the stdafx.h file it gives me like 30 errors.
Got RAM?
Tuesday, March 10, 2009 3:55 AM
You can get information and source code for exemple programming in serial port.
http://thaiio.com/prog-cgi/programing.cgi?0023 Part I
http://thaiio.com/prog-cgi/programing.cgi?0024 Part II
Monday, September 9, 2013 5:18 AM | 1 vote
void SelectComPort() //added fucntion to find the present serial ports of the system;
{
TCHAR lpTargetPath[5000]; // buffer to store the path of the COMPORTS
DWORD test;
bool gotPort=0; // in case the port is not found
for(int i=0; i<255; i++) // checking ports from COM0 to COM255
{
CString str;
str.Format(_T("%d"),i);
CString ComName=CString("COM") + CString(str); // converting to COM0, COM1, COM2
test = QueryDosDevice(ComName, (LPSTR)lpTargetPath, 5000);
// Test the return value and error if any
if(test!=0) //QueryDosDevice returns zero if it didn't find an object
{
m_MyPort.AddString((CString)ComName); // add to the ComboBox
gotPort=1; // found port
}
if(::GetLastError()==ERROR_INSUFFICIENT_BUFFER) //in case buffer got filled
{
lpTargetPath[10000]; // in case the buffer got filled, increase size of the buffer.
continue;
}
}
if(!gotPort) // if not port
m_MyPort.AddString((CString)"No Active Ports Found"); // to display error message incase no ports found
}
Wednesday, August 28, 2019 4:59 AM
This is beautiful! It took so much searching to find this.