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); //设置串口号