MFC USB detecting

Step 1: 创建MFC程序

在这里插入图片描述

Step 2: 消息处理成员函数声明

MFCApplication1Dlg.h 中添加一行:

class CMFCApplication1Dlg : public CDialogEx
{
// 构造
public:
	CMFCApplication1Dlg(CWnd* pParent = nullptr);	// 标准构造函数
	//LRESULT CU_disk_detection_scanningDlg::WindowProc(UINT message, WPARAM wparam, LPARAM lparam);

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MFCAPPLICATION1_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
	LRESULT OnMyDeviceChange(WPARAM wParam, LPARAM lParam); /!!! 添加的声明

Step 3: 添加一行消息映射:

在 MFCApplication1Dlg.cpp 文件中添加一行 ON_MESSAGE(WM_DEVICECHANGE, OnMyDeviceChange)

BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_MESSAGE(WM_DEVICECHANGE, OnMyDeviceChange)  !!!! 添加的行
END_MESSAGE_MAP()

Step 4: 添加其他函数和消息处理函数:

在 MFCApplication1Dlg.cpp 中添加其他函数和消息处理函数:

char FirstDriveFromMask(ULONG unitmask)
{
	char i;
	for (i = 0; i < 26; ++i)
	{
		if (unitmask & 0x1)
			break;
		unitmask = unitmask >> 1;
	}
	return (i + 'A');
}

LRESULT CMFCApplication1Dlg::OnMyDeviceChange(WPARAM wParam, LPARAM lParam)
{
	PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
	switch (wParam)
	{
	case WM_DEVICECHANGE:
		break;
	case DBT_DEVICEARRIVAL://DBT_DEVICEARRIVAL,设备检测结束,并且可以使用
	{
		if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
		{
			PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
			switch (lpdbv->dbcv_flags)
			{
			case 0:                //U盘
			{
				std::string sPlugMsg("检测到U盘: [");
				sPlugMsg += FirstDriveFromMask(lpdbv->dbcv_unitmask);
				sPlugMsg += "] 插入!";

				SetDlgItemText(IDC_EDIT1, sPlugMsg.c_str());

			}
			break;
			case DBTF_MEDIA:    //光盘

				std::string sCDMsg("检测到光盘:[");
				sCDMsg += FirstDriveFromMask(lpdbv->dbcv_unitmask);
				sCDMsg += "] 插入!";

				SetDlgItemText(IDC_EDIT1, sCDMsg.c_str());
				break;
			}
		}
	}
	break;
	case DBT_DEVICEREMOVECOMPLETE://DBT_DEVICEREMOVECOMPLETE,设备卸载或者拔出
	{
		if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
		{
			PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
			switch (lpdbv->dbcv_flags)
			{
			case 0:                //U盘
			{
				std::string sUnplugMsg("检测到U盘: [");
				sUnplugMsg += FirstDriveFromMask(lpdbv->dbcv_unitmask);
				sUnplugMsg += "] 拔出!";

				SetDlgItemText(IDC_EDIT1, sUnplugMsg.c_str());

			}
			break;
			case DBTF_MEDIA:    //光盘

				std::string sCDMsg("检测到光盘:[");
				sCDMsg += FirstDriveFromMask(lpdbv->dbcv_unitmask);
				sCDMsg += "] 插入!";
				SetDlgItemText(IDC_EDIT1, sCDMsg.c_str());

				break;
			}
		}
	}
	break;
	}
	return 0;

}

Step 5. 其他

5.1 修改项目属性,改为使用多字节字符集

在这里插入图片描述

5.2 MFCApplication1Dlg.cpp 增加头文件

#include <string>

5.3 其他头文件

#include<dbt>
#include<winioct1>
#include<windows>  // 这个可能不需要加,对于MFC

*** 注意 CMFCApplication1Dlg 很可能要相应修改 !不是所有的项目都一样的名称***

使用 VS2017 运行结果示意图:

这个程序并不够完善,但是可以跑起来了。
在这里插入图片描述

========================
在这里插入图片描述

在这里插入图片描述

### USB通信电路设计与实现 #### 设计概述 USB(Universal Serial Bus)是一种广泛应用的串行总线标准,用于连接计算机和其他外部设备。在现代电子设计中,USB接口不仅提供了一种标准化的数据传输方式,还支持供电功能。为了满足不同应用场景的需求,USB通信电路的设计需要综合考虑信号完整性、电源管理以及电磁兼容性等问题。 #### 高速差分信号处理 对于USB 3.0及其更高版本,由于其采用了高速差分信号传输机制,因此信号质量成为影响性能的关键因素之一。为提高信号稳定性,在实际设计过程中建议在线路中加入共模电感来过滤高频噪声[^1]。这种做法可以有效减少外界干扰对高速数据流的影响,从而提升整体系统的可靠性。 #### FPGA平台下的USB接口实现 利用FPGA作为核心控制器能够灵活地完成多种复杂功能模块集成,其中包括但不限于以太网MAC层控制单元、UART异步收发器阵列以及USB主机/设备模式切换逻辑等部分[^2]。具体而言,通过配置相应的IP核或者编写自定义HDL代码片段即可轻松达成目标应用需求。 以下是基于Verilog HDL的一个简单示例程序段落展示如何初始化一个基本状态机框架用于管理USB端口操作: ```verilog module usb_state_machine ( input wire clk, // Clock signal input wire reset_n, // Active low asynchronous reset output reg [7:0] status // Status register indicating current state of operation ); parameter IDLE = 8'b0000_0001; parameter CONNECTING = 8'b0000_0010; parameter TRANSFERRING_DATA = 8'b0000_0100; always @(posedge clk or negedge reset_n) begin : proc_status if (!reset_n) begin status <= IDLE; // Reset to idle upon active-low reset assertion. end else case (status) IDLE: // Wait until connection event occurs. if(/* condition for detecting device attachment */) status <= CONNECTING; CONNECTING: // Establish communication link with attached peripheral. if(/* handshake completed successfully */) status <= TRANSFERRING_DATA; TRANSFERRING_DATA: // Handle ongoing data exchange activities here... /* Add your specific transfer handling logic */ default: // Should never reach this point under normal circumstances. status <= IDLE; endcase end endmodule ``` 此代码仅为概念验证性质的状态转换模型雏形示意,并未包含完整的功能性细节;实际项目开发时需依据特定规格书进一步扩展完善各个阶段内的行为描述。 #### 总结 综上所述,针对USB通信电路的设计工作应当着重关注以下几个方面:一是确保高速差分信道具备良好的电气特性表现;二是合理选用硬件组件比如前述提到过的共模扼流圈元件辅助优化链路品质;三是借助先进的EDA工具配合高效算法构建智能化解决方案如采用现场可编程门阵列器件执行多任务并发调度作业流程等等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值