MFC_自动识别串口

exe文件链接:

MFC_串口调试助手_自动识别串口号-其它文档类资源-CSDN下载

1、话不多说,先上几张成功的图

2、下面进行源码分析

串口其他界面之类的东西我这里就不再复数了,主要介绍下串口自动识别部分;

关键参数:

核心函数:

EnumerateSerialPorts   获取可用串口

AddCom 添加串口

//下面两个独立函数
CUIntArray ports; 	//所有存在的串口          
CUIntArray portse;	//可用的串口    
CUIntArray portsu;   //已占用的串口 
#define MAX_SCAN_CNT	128

void EnumerateSerialPorts(CUIntArray& porta, CUIntArray& portse, CUIntArray& portsu)
{
	//CommList* pComList = GetCmmList(0x1FF);
	//memset((unsigned char*)pComList, 0xff, sizeof(CommList));


	//清除串口数组内容 
	porta.RemoveAll();
	portse.RemoveAll();
	portsu.RemoveAll();
	//因为至多有255个串口,所以依次检查各串口是否存在                                                   
	//如果能打开某一串口,或打开串口不成功,但返回的是 ERROR_ACCESS_DENIED错误信息,                    
	//都认为串口存在,只不过后者表明串口已经被占用                                                      
	//否则串口不存在
	for (int i = 1;i < MAX_SCAN_CNT;i++)
	{
		//形成原始设备名称
		CString sPort;
		sPort.Format(_T("\\\\.\\COM%d"),i);
		//尝试打开该端口
		BOOL bSuccess = FALSE;
		HANDLE hPort = ::CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
		if (hPort == INVALID_HANDLE_VALUE)
		{
			DWORD dwError = GetLastError();
			
			if (dwError == ERROR_ACCESS_DENIED)
			{
				bSuccess = TRUE;
				portsu.Add(i);//已占用的串口
			}

		}
		else
		{
			//该端口已成功打开
			bSuccess = TRUE;
			portse.Add(i);//可用串口
			//不要忘记关闭端口,因为我们不会对它做任何事情
			CloseHandle(hPort);
		}
		//将端口号添加到将要返回的数组中
		if (bSuccess)
		{
			porta.Add(i);//所有存在的串口
			/*pComList[i].index = i;
			pComList[i].num = i;*/
		}

	}
}



unsigned short AddCom(CComboBox* pvect)
{
	unsigned short uicounter; //串口数量
	unsigned short uisetcom;
	CString str;

	EnumerateSerialPorts(ports, portse, portsu);  //获得可用串口数
	//获取可用串口个数  
	uicounter = portse.GetSize();
	//如果个数大于0  
	if (uicounter > 0)
	{
		//初始化串口列表框
		for (int i = 0;i < uicounter;i++)
		{
			uisetcom = portse.ElementAt(i);
			str.Format(_T("COM%d "), uisetcom);
			pvect->InsertString(i, str);
		}
	}
	return uicounter;
}

//下拉框的回调函数
void CMFCUARTV4Dlg::OnCbnDropdownComboPort()
{
	// TODO: 在此添加控件通知处理程序代码

	UpdateData(TRUE);
	//更新能用的串口
	unsigned short com_cnt;
	while (m_cboPort.DeleteString(0) >= 0);
	com_cnt = AddCom(&m_cboPort);
	if (com_cnt)
	{
		m_cboPort.DeleteString(com_cnt + 1);
		m_cboPort.SetCurSel(0);
	}
	UpdateData(FALSE);
}


关键点

	//这个写在打开串口前面
	int m_nCom;         //串口号
	m_nCom = m_cboPort.GetCurSel() + 1;


	CString InText;  //定义文本字符串
	char* ptrAsciiSend;
	int i;

	((CComboBox*)GetDlgItem(IDC_COMBO_PORT))->SetCurSel(m_intPort);//设置选取
	((CComboBox*)GetDlgItem(IDC_COMBO_PORT))->GetWindowText(InText);//得到文本

	ptrAsciiSend = (char*)InText.GetBuffer(0);//得到文本数据
	ptrAsciiSend += 3; //"COM" 串口号数据
	i = 0;

	sscanf_s(ptrAsciiSend, "%d", &i); //得到实际串口号
	m_ComNo = i;

	m_mscomm.put_CommPort(m_ComNo); //设置串口号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值