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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章