有几种方法可以列出Windows下的串行端口,但我不确定什么是正确的方法:检测所有可用串行端口的方式。
一个很好的代码示例是http://www.naughter.com/enumser.html - 其中有9种(9种!)枚举串行设备的方法。
问题是:这样做的最佳方式是什么。
要求:
COMx
不同的端口。答案 0 :(得分:5)
void SelectComPort() //added function to find the present serial
{
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)
{
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
}
答案 1 :(得分:3)
串口是非常简单的设备,可以追溯到计算硬件的石器时代。他们不支持Plug&amp;玩,没有办法告诉有人插入设备。您唯一能做的就是发现可用的端口,SerialPort.GetPortNames()返回列表。一些USB模拟器可以生成描述性名称以使用端口名称,您可以发现具有WMI,Win32_SerialPort类的名称。
这些都无法帮助您发现哪个COM端口连接到特定设备。只有人知道,她才将电缆插入连接器中。您需要提供一个配置UI,让用户选择端口号。组合框可以完成工作。将选择保存在您的配置数据中,非常可能在下次程序启动时设备仍然连接到同一端口。
答案 2 :(得分:3)
如果您可以访问注册表,HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
键包含Windows当前支持的COM端口列表(在某些情况下,此信息可能是陈旧/不正确的;我怀疑,当插件和播放时提供串口的设备尚未完成检测/安装或最近已被删除。
这是.NET Framework的SerialPort.GetPortNames()
方法报告可用COM端口的方式,上述信息来自链接页面。
答案 3 :(得分:0)
这是@ michael-jacob-mathew答案的现代化版本:
#include <iostream>
#include <string>
#include <Windows.h>
bool SelectComPort() //added function to find the present serial
{
char lpTargetPath[5000]; // buffer to store the path of the COMPORTS
bool gotPort = false; // in case the port is not found
for (int i = 0; i < 255; i++) // checking ports from COM0 to COM255
{
std::string str = "COM" + std::to_string(i); // converting to COM0, COM1, COM2
DWORD test = QueryDosDevice(str.c_str(), lpTargetPath, 5000);
// Test the return value and error if any
if (test != 0) //QueryDosDevice returns zero if it didn't find an object
{
std::cout << str << ": " << lpTargetPath << std::endl;
gotPort = true;
}
if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
}
}
return gotPort;
}
它在我的计算机上产生以下输出:
COM1: \Device\Serial0
COM3: \Device\VCP0
答案 4 :(得分:0)
修改后的@Dženan答案,以使用宽字符并返回整数列表
#include <string>
#include <list>
list<int> RS232_Port::getAvailablePorts()
{
wchar_t lpTargetPath[5000]; // buffer to store the path of the COMPORTS
list<int> portList;
for (int i = 0; i < 255; i++) // checking ports from COM0 to COM255
{
wstring str = L"COM" + to_wstring(i); // converting to COM0, COM1, COM2
DWORD res = QueryDosDevice(str.c_str(), lpTargetPath, 5000);
// Test the return value and error if any
if (res != 0) //QueryDosDevice returns zero if it didn't find an object
{
portList.push_back(i);
//std::cout << str << ": " << lpTargetPath << std::endl;
}
if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
}
}
return portList;
}
答案 5 :(得分:0)
您可以检查 Windows 注册表库以列出所有 COM 端口。这是我的代码 > github file
答案 6 :(得分:-2)
CUIntArray ports;
EnumerateSerialPorts(ports);
for (int i = 0; i<ports.GetSize(); i++)
{
CString str;
str.Format(_T("COM%d"), ports.ElementAt(i));
m_ctlPort.AddString(str);
}