教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 实用模板 >

基于STM32的USB程序开发笔记(7)

来源:网络收集 时间:2026-08-12
导读: http://www.hkaco.com #define ReadFrom_EP2 \\ CTL_CODE(FILE_DEVICE_EZUSB, 0x800, METHOD_IN_DIRECT, FILE_ANY_ACCESS) #define WriteTo_EP1 \\ CTL_CODE(FILE_DEVICE_EZUSB, 0x801, METHOD_OUT_DIRECT, FILE_AN

http://www.hkaco.com

#define ReadFrom_EP2 \\

CTL_CODE(FILE_DEVICE_EZUSB, 0x800, METHOD_IN_DIRECT, FILE_ANY_ACCESS) #define WriteTo_EP1 \\

CTL_CODE(FILE_DEVICE_EZUSB, 0x801, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)

这部分定义的是DeviceIoControl()函数所需要的I/O控制代码,此定义在DriverWizard生成的interface.h文件中,在这可包含interface.h也可以复制过来进行定义。

typedef struct _NODE_ENUDEVICEINTERFACE {

CHAR pDeviceInterfaceSymbolicName[MAX_PATH]; // Index for this node

struct _NODE_ENUDEVICEINTERFACE *pNext; }

NODE_ENUMDI, *PNODE_ENUMDI;

这个链表用以存储USB设备的接口名称,需要另外说明的一点,在USBAPI.c文件中定义了:

DEFINE_GUID(GUID_DEVICEINTERFACE, 0xE075C5B2, 0xE7FB, 0x4186, 0xA1, 0x39, 0x0B, 0x3F, 0xD2, 0x05, 0xE7, 0x6E);

需要通过这个GUID_DEVICEINTERFACE取得该接口名称,有了该接口名称后就可以通过CreateFile()获取该接口的句柄,进而可以通过ReadFile()/WriteFile()或者DeviceIoControl()读写USB设备。获取一个设备可能有多个接口,在该类中建立了一个循环链表用以存储该信息。

typedef struct _STRUCT_IO {

HWND hTargetWnd;

HANDLE hDevice;

DWORD dwIoControlCode;

PCHAR pInBuffer; DWORD dwInSize;

PCHAR pOutBuffer; DWORD dwOutSize;

LPDWORD lpBytesReturned; }

STRUCT_IO,

http://www.hkaco.com

*PSTRUCT_IO;

这个结构中的hTargetWnd定义了消息对象的窗口句柄,用以向该窗口发送读写数据完成的消息;hDevice即USB设备接口的句柄;其他的含义很明了,就不说明了。

#define CORESTATUS_SUCCESS 0x0000L #define CORESTATUS_DESTROY 0x0001L

#define CORESTATUS_READWRITE_EVENT_ERROR 0x0002L #define CORESTATUS_READWRITE_THREAD_ERROR 0x0003L #define CORESTATUS_IOCONTROL_EVENT_ERROR 0x0004L #define CORESTATUS_IOCONTROL_THREAD_ERROR 0x0005L 这些是定义的类状态,应用程序可以获取这些状态。

#define MSG_READWRITE_COMPLETION WM_USER+0x0010 #define MSG_IOCONTROL_COMPLETION WM_USER+0x0011 这些定义的是自定义消息码,应用程序识别此消息码可得知读写操作已完成。

#define ERROR_HANDLE_WINDOW 0x1000L #define ERROR_HANDLE_DEVICE 0x1001L #define ERROR_BUFFER_LENGTH 0x1002L #define ERROR_BUFFER_ISNULL 0x1003L #define ERROR_READWRITE_BUSY 0x1004L #define ERROR_IOCONTROL_BUSY 0x1005L

这些定义的进行读写操作时,进行的一些参数检查并返回的状态。

下面这些是类成员函数以及变量,USBAPI类内建立了两个独立线程,这样在对USB设备进行读写时,就不会堵塞应用程序的窗口线程,读写操作完成后由消息MSG_READWRITE_COMPLETION和MSG_IOCONTROL_COMPLETION通知应用程序。详细代码请参考源程序。

// ********************************************************************************************************** // Class members definition

// ********************************************************************************************************** class CUSBAPI {

public:

CUSBAPI();

virtual ~CUSBAPI();

public:

DWORD EnumDeviceInterface(LPGUID pGUID);

HANDLE OpenDeviceInterface(PCHAR pDeviceInterfaceSymbolicName);

http://www.hkaco.com

DWORD Execute_ReadFile( HWND hWnd, HANDLE hDevice, PCHAR pInBuffer, DWORD dwInSize,

LPDWORD lpBytesReturned );

DWORD Execute_WriteFile( HWND hWnd, HANDLE hDevice, PCHAR pOutBuffer, DWORD dwOutSize,

LPDWORD lpBytesReturned );

DWORD Execute_IoControl( HWND hWnd, HANDLE hDevice,

DWORD dwIoControlCode, PCHAR pInBuffer, DWORD dwInSize, PCHAR pOutBuffer, DWORD dwOutSize,

LPDWORD lpBytesReturned );

BOOL Node_HeadCreate(VOID); VOID Node_HeadDelete(VOID); VOID Node_RemoveAll(VOID);

BOOL Node_Append(PCHAR pDeviceInterfaceSymbolicName); VOID Node_Remove(PCHAR pDeviceInterfaceSymbolicName);

PNODE_ENUMDI Node_Find(PCHAR pDeviceInterfaceSymbolicName);

public:

GUID GUID_Device;

PNODE_ENUMDI pEnumDeviceNode; PNODE_ENUMDI pEnumDeviceHead;

HANDLE hEvent_ReadWrite; HANDLE hEvent_IoControl;

http://www.hkaco.com

HANDLE hThread_ReadWrite; HANDLE hThread_IoControl;

DWORD dwThreadID_ReadWrite; DWORD dwThreadID_IoControl;

STRUCT_IO ReadWrite; STRUCT_IO IoControl;

BOOL bExecuting_IoControl; BOOL bExecuting_ReadWrite;

DWORD dwCoreStatus; };

#endif

在应用程序中定义变量:CUSBAPI ezUSB; 读写操作函数也就三种:

Execute_IoControl()、Execute_ReadFile()、Execute_WriteFile()

执行这些函数后,将与USB的驱动程序挂钩,分别响应:

Execute_IoControl() -> NTSTATUS ezUSBDevice::DeviceControl(KIrp I) Execute_ReadFile() -> NTSTATUS ezUSBDevice::Read(KIrp I) Execute_WriteFile() -> NTSTATUS ezUSBDevice::Write(KIrp I)

其中NTSTATUS ezUSBDevice::DeviceControl(KIrp I)根据I.IoctlCode()区别类型,按照此示例说明:

ReadFrom_EP2->Execute_IoControl()->NTSTATUS ezUSBDevice::ReadFrom_EP2_Handler(KIrp I)

WriteTo_EP1->Execute_IoControl()->NTSTATUS ezUSBDevice::WriteTo_EP1_Handler(KIrp I)

这样应用程序与USB驱动之间就建立了通讯渠道,在驱动函数中: NTSTATUS ezUSBDevice::DeviceControl(KIrp I) NTSTATU …… 此处隐藏:3650字,全部文档内容请下载后查看。喜欢就下载吧 ……

基于STM32的USB程序开发笔记(7).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/454341.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)