MFC 自动获取可用com串口(串口号以及名称)

之前获取串口号都是从注册表中获取,现在用一个新的方法能够获取窗口名称和串口号;

 

1、首先#include <setupapi.h> #pragma comment(lib, "Setupapi.lib")

不同电脑位置不一样

可以在系统盘C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib(Setupapi.lib

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include(Setupapi.h直接复制到你的工程目录下面,如下:

#include <setupapi.h>
#pragma comment(lib, "Setupapi.lib")
SCtring com1 , com2 , com_1 , com_2;

2、在OnInitDialog()里面添加

HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, NULL, NULL, 0);
HANDLE hCom;
if (hDevInfo)
	{
		int iy = 0;
		SP_DEVINFO_DATA SpDevInfo = { sizeof(SP_DEVINFO_DATA) };
		for (DWORD iDevIndex = 0; SetupDiEnumDeviceInfo(hDevInfo, iDevIndex, &SpDevInfo); iDevIndex++)
		{
			TCHAR szName[512] = { 0 };
			if (SetupDiGetDeviceRegistryProperty(hDevInfo, &SpDevInfo, SPDRP_FRIENDLYNAME,
				NULL, (PBYTE)szName, sizeof(szName), NULL))
			{
				_tprintf(_T("%s\n"), szName);
				CString com, str, strComOpen;
				str.Format(_T("%s"), szName);//获取串口的名称COM2
				int posBeg = str.Find('(');
				int posEnd = str.Find(')');
				com = str.Mid(posBeg + 1, posEnd - posBeg - 1);//获取串口的名称COM2
				strComOpen = _T("\\\\.\\") + com;
				hCom = CreateFile(strComOpen, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);//如果返回不为空则此串口可用
				if (INVALID_HANDLE_VALUE == hCom || ComYanzheng == com)
				{
					DWORD error = ::GetLastError();//取得错误信息 
				}
				else
				{
					ComYanzheng = com;
					ComY[iy] = str;
					iy++;
				}
				CloseHandle(hCom);

			}
		}
		SetupDiDestroyDeviceInfoList(hDevInfo);
	}

其次加获取的串口名和串口号写入下拉列表

if (ComY[0] == ""&&ComY[1] == ""&&ComY[2] == ""&&ComY[3] == "") {
		com1.AddString(_T("无可用串口"));
		com2.AddString(_T("无可用串口"));
		com1.SetCurSel(0);
		com2.SetCurSel(0);
	}
	else
	{
		for (int iu = 0; iu < 4; iu++)
			if (ComY[iu] != "") {
				com1.AddString(ComY[iu]);
			}

		for (int ix = 0; ix < 4; ix++)
			if (ComY[ix] != "") {
				com2.AddString(ComY[ix]);
			}
		com1.SetCurSel(1);
		com2.SetCurSel(0);
	}s

从下拉列表读取

int indexd = com1.GetCurSel();
com1.GetLBText(indexd, strd);
int posBeg = strd.Find('(');
int posEnd = strd.Find(')');
com_1= strd.Mid(posBeg + 4, posEnd - posBeg - 1);//获取串口的名称COM1

int indexy = com2.GetCurSel();
com2.GetLBText(indexy, stry);
int posBeg2 = stry.Find('(');
int posEnd2 = stry.Find(')');
com_2 = stry.Mid(posBeg2 + 4, posEnd2 - posBeg2 - 1);//获取串口的名称COM2

 

 

 

  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西伯利亚大橘猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值