基于VC6实现串口名称读取和热插拔功能
实现 基于 功能 读取 名称 串口 热插拔
2023-09-14 09:06:41 时间
-
创建一个基于对话框的应用,并加入以下控件
-
按ALT+W键,然后为ComboBox控件关联变量
-
准备EnumSerial.cpp和EnumSerial.h文件并加入到工程
文件下载地址:
链接:https://pan.baidu.com/s/1lwrkSH90fteFFD3CAnXeHw
提取码:ih78
-
在工程配置中加入setupapi.lib库
-
在测试对话框CPP中加入头文件
#include "EnumSerial.h"
-
实现方法 void paserComPort(CString &str,CString &port)
void CCom_testDlg:: paserComPort(CString &str,CString &port) { int posBeg = str.Find("("); int posEnd = str.Find(")"); port = str.Mid(posBeg+1,posEnd-posBeg-1);//获取串口的名称COM2 }
-
实现方法 bool CCom_testDlg:: UpgradeDeviceSerialCom(CString &port)
bool CCom_testDlg:: UpgradeDeviceSerialCom(CString &port) { CArray<SSerInfo, SSerInfo&> asi; // Populate the list of serial ports. EnumSerialPorts(asi, TRUE);//FALSE遍历所有的串口,TRUE只是枚举可以打开的串口 //EnumSerialPorts(asi, TRUE); bool is_close_com = false; m_ctrl_com.ResetContent(); int size = asi.GetSize(); for (int ii = 0; ii<size; ii++) { //显示读取串口的全称 m_ctrl_com.InsertString(ii,asi[ii].strFriendlyName); } if(size>0) { m_ctrl_com.SetCurSel(0); for(int i=0;i<size;i++) { if(port.Compare(asi[i].strFriendlyName)==0) is_close_com = true; } } else { is_close_com = true; } return is_close_com; }
-
在OnInitDialog中调用UpgradeDeviceSerialCom()方法
-
插上串口设备编译运行
-
实现热插拔功能
在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏之间加入ON_WM_DEVICECHANGE()
加入afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData)声明
OnDeviceChange()方法实现
BOOL CCom_testDlg::OnDeviceChange(UINT nEventType,DWORD dwData)
{
DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData;
CString m_port_name="";
switch (nEventType)
{
case DBT_DEVICEREMOVECOMPLETE://移除设备
{
int cur_index = m_ctrl_com.GetCurSel();
m_ctrl_com.GetLBText(cur_index,m_port_name);
}
case DBT_DEVICEARRIVAL://添加设备
{
if(DBT_DEVTYP_PORT == dbd->dbcc_devicetype) //串口设备
{
if(UpgradeDeviceSerialCom(m_port_name))//刷新组合框的内容
{
MessageBox("选中的设备被拔除");
}
}
}
break;
default:
break;
}
return TRUE;
}
在对话框CPP文件中加入头文件#include <Dbt.h>,并在stdafx.h文件中定义宏
#define WINVER 0x0500
编译运行
Demo下载地址:https://download.csdn.net/download/mygod2008ok/12249862
相关文章
- Verilog设计实例(6)基于Verilog的各种移位寄存器实现「建议收藏」
- 全栈开发之基于云开发实现微信聊天功能
- 基于netty实现rpc远程调用
- Go 函数式编程篇(七):基于管道技术实现函数的流式调用
- AI 实战篇 |基于 AI开放平台实现 【货币识别】 功能,彻底解决货币盲区
- 基于 Spring Aop 环绕通知实现 Redis 缓存双删功能(示例代码)
- 基于Redis位图实现用户签到功能
- 基于java实现mongodb的数据库连接池详解大数据
- 基于易语言实现MySQL登录注册功能(易语言mysql登录注册)
- 利用httpd实现基于http协议的反向代理至后端Tomcat服务器
- MySQL中存储BLOB类型数据的实现方式(mysql blob数据)
- 基于Redis实现搜索自动补全功能(搜索自动补全redis)
- 缓存功能基于SSM框架实现Redis缓存提升网站性能(ssm实现redis)
- 基于Redis的分布式任务调度实现(分布式任务调度redis)
- 基于Redis实现多级评论功能(多级评论redis)
- 使用Redis实现轻松计数(基于redis计数)
- 基于Redis的延时队列服务实现(基于redis延时队列)
- 基于Redis技术加速网站缓存性能(基于redis实现缓存)
- 圣诞节MerryChristmas给博客添加浪漫的下雪效果基于jquery实现
- 基于jQuery实现图片的前进与后退功能
- 基于asp.net下使用jquery实现ajax的解决方法
- 基于JavaScript实现继承机制之调用call()与apply()的方法详解
- 基于ProtobufC++serialize到char*的实现方法分析
- Java基于swing实现的弹球游戏代码
- 基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览实例
- 使用wxpython实现的一个简单图片浏览器实例
- 基于javascript实现的搜索时自动提示功能