exe文件链接:
https://download.csdn.net/download/qq_35671135/13008443
源码文件链接:
https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb9dj0AC&ft=t&id=629692644823
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); //设置串口号