如何知道自己的电脑上有无串口呢? -- 手动

1. 查看电脑,看是否有串口器件(串口是一个九针的D型接口)

2. 在设备管理器上查看

乍一看,还以为是有两个串口,其实仔细看描述就知道,这是蓝牙虚拟串口,并不是真实的串口,这台电脑上是没有接真实的串口的。(附上)Win10开启蓝牙虚拟串口的方法

3. 在注册表中查看

【运行】--》【regedit】--》【HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM】,可以在右侧看到COM的信息

也可以看到蓝牙虚拟串口的信息,占用了COM5, COM6端口。

4. 通过系统自带的WMI方式查询

【运行】--》【wbemtest】

用程序的方式获取串口的信息

参考链接:https://www.cnblogs.com/HPAHPA/p/7928719.html

https://blog.csdn.net/md521/article/details/8191871

方法一:知道串口的GUID,通过API的方式获取串口的信息

// 方法一: 通过API的方式获取串口信息
void EnumerCOMPortByGUID()
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i = 0; hDevInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVCLASS_PORTS, 0, 0, DIGCF_PRESENT);
/*
GUID_DEVCLASS_FDC软盘控制器
GUID_DEVCLASS_DISPLAY显示卡
GUID_DEVCLASS_CDROM光驱
GUID_DEVCLASS_KEYBOARD键盘
GUID_DEVCLASS_COMPUTER计算机
GUID_DEVCLASS_SYSTEM系统
GUID_DEVCLASS_DISKDRIVE磁盘驱动器
GUID_DEVCLASS_MEDIA声音、视频和游戏控制器
GUID_DEVCLASS_MODEMMODEM
GUID_DEVCLASS_MOUSE鼠标和其他指针设备
GUID_DEVCLASS_NET网络设备器
GUID_DEVCLASS_USB通用串行总线控制器
GUID_DEVCLASS_FLOPPYDISK软盘驱动器
GUID_DEVCLASS_UNKNOWN未知设备
GUID_DEVCLASS_SCSIADAPTERSCSI 和 RAID 控制器
GUID_DEVCLASS_HDCIDE ATA/ATAPI 控制器
GUID_DEVCLASS_PORTS端口(COM 和 LPT)
GUID_DEVCLASS_MONITOR监视器
*/ if (hDevInfo == INVALID_HANDLE_VALUE)
{
DWORD dwError = GetLastError();
// Insert error handling here.
return;
} // Enumerate through all devices in Set.
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
{
DWORD DataT = 0;
char buffer[256] = { 0 };
char buffer1[512] = { 0 };
DWORD buffersize = sizeof(buffer);
DWORD buffersize1 = sizeof(buffer1); while (!SetupDiGetDeviceRegistryProperty(hDevInfo,
&DeviceInfoData,
SPDRP_FRIENDLYNAME,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
//if (buffer) LocalFree(buffer);
printf("111");
}
else
{
// Insert error handling here.
//cout << "Friend Name is " << buffer << endl;
printf("222");
break;
}
} cout << "Friend Name is " << buffer << endl;
while (!SetupDiGetDeviceRegistryProperty(hDevInfo,
&DeviceInfoData,
SPDRP_HARDWAREID,
&DataT,
(PBYTE)buffer1,
buffersize1,
&buffersize1))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
//if (buffer) LocalFree(buffer);
printf("333");
}
else
{
// Insert error handling here.
//cout << "Friend Name is " << buffer << endl;
printf("444");
break;
}
}
cout << "HWID is " << buffer1 << endl; //if (buffer)
//{
// LocalFree(buffer);
//}
}
if (GetLastError() != NO_ERROR && GetLastError() != ERROR_NO_MORE_ITEMS)
{
return;
} // Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
}

方法二:通过注册表的方式获取串口的信息

// 方法二:通过注册表的方式获取串口消息
void EnumerCOMPortByGenKey() {
CRegKey RegKey;
int nCount = 0; if (RegKey.Open(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM") == ERROR_SUCCESS)
{
while (true)
{
char ValueName[_MAX_PATH];
unsigned char ValueData[_MAX_PATH];
DWORD nValueSize = _MAX_PATH;
DWORD nDataSize = _MAX_PATH;
DWORD nType; if (::RegEnumValue(HKEY(RegKey), nCount, ValueName, &nValueSize, NULL, &nType, ValueData, &nDataSize) == ERROR_NO_MORE_ITEMS)
{
break;
} printf("%s\n", ValueName); printf("%s\n", ValueData); nCount++;
}
}
printf("%d\n", nCount); }

方法三:通过Createfile方法轮询读取串口

// 方法三:使用CreateFile函数轮询读取串口
void GetSerialPortState(char* sp)
{
int nCom = 0;
HANDLE hCom;
int count = 0; do
{
nCom++;
char strCom[8];
sprintf_s(strCom, "%s%d", sp, nCom);
printf("%s\n", strCom); hCom = CreateFile(strCom, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);//轮询打开串口
if (INVALID_HANDLE_VALUE == hCom)
{
DWORD err = ::GetLastError();
}
else
{
count++;
printf("%s has opened\n", strCom);
}
CloseHandle(hCom);//关闭串口
} while (nCom < 256);
printf("count = %d\n", count);
} int main(int argc, char* argv[])
{
if (strcmp(argv[1], "COM") == 0)
GetSerialPortState(argv[1]);
else if(strcmp(argv[1], "LPT") == 0)
GetSerialPortState(argv[1]);
}

涉及到的头文件有

#include <iostream>
#include <Windows.h>
#include "setupapi.h"
#include "devguid.h" #include <atlbase.h> using namespace std; #pragma comment(lib, "setupapi.lib")

方法四:通过WMI的方式

这个方法比较通用,就不详细说了,随便找一篇WMI的文章就可以了。

C++第五十篇 -- 获取串口的描述信息的更多相关文章

  1. .NET获取枚举DescriptionAttribute描述信息性能改进的多种方法

    一. DescriptionAttribute的普通使用方式 1.1 使用示例 DescriptionAttribute特性可以用到很多地方,比较常见的就是枚举,通过获取枚举上定义的描述信息在UI上显 ...

  2. 第五十篇 入门机器学习——线性回归(Linear Regression)

    No.1. 线性回归算法的特点 No.2. 分类问题与回归问题的区别 上图中,左侧为分类问题,右侧为回归问题.左侧图中,横轴和纵轴表示的都是样本的特征,用不同的颜色来作为输出标记,表示不同的种类:左侧 ...

  3. 黄聪:WordPress 多站点建站教程(五):获取子站点用户信息(通过输入站点ID号来获取该站点的所有用户)

    得到站点ID为1的用户 <ul> <?php $blogusers = get_users('blog_id=1'); foreach ($blogusers as $user) { ...

  4. 第五十篇、OC中常用的第三插件

    1.UIViewController-Swizzled 当你接手一个新项目的时候,使用该插件,可以看到控制器的走向,当前控制是哪个,下一个跳转到哪里 2. 一个Xcode小插件,将Json直接转成模型 ...

  5. R语言学习笔记(十五):获取文件和目录信息

    file.info() 参数是表示文件名称的字符串向量,函数会给出每个文件的大小.创建时间.是否为目录等信息. > file.info("z.txt") size isdir ...

  6. 第五十篇: webpack中的loader(一) --css-loader

    好家伙, 1.webpack配置中devServer节点的常用配置项 devServer:{ //首次打包完成后,自动打开浏览器 open:ture, //在http协议中,如果端口号是80,则可以被 ...

  7. 获取类的描述信息 DescriptionAttribute

    static void Main(string[] args) { var attrs = typeof(TestClass).GetCustomAttributes(typeof(System.Co ...

  8. 《手把手教你》系列技巧篇(五十)-java+ selenium自动化测试-字符串操作-上篇(详解教程)

    1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...

  9. 《手把手教你》系列技巧篇(五十二)-java+ selenium自动化测试-处理面包屑(详细教程)

    1.简介 面包屑(Breadcrumb),又称面包屑导航(BreadcrumbNavigation)这个概念来自童话故事"汉赛尔和格莱特",当汉赛尔和格莱特穿过森林时,不小心迷路了 ...

随机推荐

  1. 《Docker基础与实战,看这一篇就够了》

    什么是Docker? Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术 ...

  2. Mac为docker和kubectl添加自动命令补全

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 自动命令补全是非常有用的功能,特别是当命令有特别多参数时.显然,docker/kubectl就是这样的命令.我们 ...

  3. Linux常见信号介绍

    1.信号 首先信号我们要和信号量区分开来,虽然两者都是操作系统进程通信的方式.可以简单的理解,信号是用来通知进程发生了什么需要做什么,信号量一般是用作进程同步(pv操作) 2.常见信号量 (以下数字标 ...

  4. 解决使用gomod后goland导包报红问题

    解决使用gomod后goland导包报红问题 项目环境: ubuntu14+goland 问题详情: 在root用户下执行go mod init {module name}使用了gomod,并编译了项 ...

  5. Linux基本命令精讲

    一.Shell Linux系统中运行的一种特殊程序 在用户和内核之间充当"翻译官 用户登录 Linux系统时,自动加载一个 Shell程序 Bash是 LinuxShell系统中默认使用的程 ...

  6. UI自动化学习笔记- Selenium一些特殊操作的处理

    一.特殊操作处理 1. 下拉选择框操作 1.1 如何操作下拉选择框 实现方式一 思路:先定位到要操作的option元素,然后执行点击操作 driver.find_element_by_css_sele ...

  7. POJ 2947 2947 Widget Factory 高斯消元

    给出组件的数量n,给出记录的数量m(n就是变元数量,m是方程数量).每一个记录代表一个方程,求每个组件的生产天数. 高斯消元即可 #include <cstdio> #include &l ...

  8. Netty Recycler的源码分析

    Recycler分析 调用来源:PooledByteBuf.java 涉及的知识: AtomicInteger WeakReference ThreadLocal 在DefaultHandle 中调用 ...

  9. java.lang.Excetion,java.lang.RuntimeException,java.lang.Error有什么区别?

    Error类对象由Java虚拟机生成并抛出,Exception类对象由应用程序处理或抛出 Error表示恢复不是不可能但很困难的情况下的一种严重问题.比如说内存溢出.不可能指望程序能处理这样的情况. ...

  10. SpringMVC(10)实现注解式权限验证

    在项目中如何处理出现的异常,在每个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的.那么如何保证我们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容->异 ...