新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于Wave Panel的HID设备通讯接口设计

基于Wave Panel的HID设备通讯接口设计

作者: 时间:2016-12-20 来源:网络 收藏

  流程中调用的Windows API 函数和结构体变量类型分别在hidpi. h.hidsdi. h.hidusage. h.setupapi. h 和hid. lib.setupapi. lib 几个文件中定义并实现 。主要包括:

  1)HidD_GetHidGuid( ):获取HID 设备的GUID值,并保存在一个GUID 结构体变量中;

  2)SetupDiGetClassDevs():根据HID 设备的GUID值获取HID 设备信息的集合,并保存在一个HDEVINFO结构体类型的变量中;

  3)SetupDiEnumDeviceInterfaces():在设备信息集合中依次获取编号为i(i = 0,1,…) 的设备接口信息,保存在一个SP_DEVICE_INTERFACE_DATA 结构体类型变量中;

  4)SetupDiGetDeviceInterfaceDetail():当获取设备接口信息成功时进一步获取该设备的详细信息,并保存设备路径;

  5)HidD_GetAttributes():获取设备属性值并保存在一个HIDD_ATTRIBUTES 结构体类型变量中.VID.PID 和PVN 值即为该结构体变量的三项成员;

  6)SetupDiDestroyDeviceInfoList( ):销毁设备信息集合。

  2. 2 读报表

  读报表是指HID 设备向主机输入数据。当WavePanel 面板上任意控制器状态发生变化时,都会在下一次轮询时将这些数据生成输入报表,并发送给主机。

  主机上的应用程序接收输入报表并对数据进行解析,然后做出相应的处理。

  由于Wave Panel 可能在任何时候与主机以中断方式进行通讯,因此应用程序需要维护一个异步调用的读报表线程。该线程在Wave Panel 没有向主机输入数据时阻塞,以减轻系统负载。当有数据输入时,线程恢复运行,调用ReadFile()将输入数据保存在缓冲区中,并对数据进行解析。这之后线程将再次被阻塞,直到有新的输入数据到来。应用程序在Wave Panel成功打开后就创建读报表线程,应用程序运行结束前该线程将一直存在。读报表流程如图2 所示。

  

  2. 3 写报表

  与读报表相反,写报表是指主机向HID 设备输出数据。写报表对延迟的要求较高,但这一功能不是必需的,根据HID 设备的实际用途而定 。鼠标。键盘。游戏杆等较简单的设备只向主机发送数据,这些数据通常是一些控制信息和状态信息 ,例如改变HID 设备液晶屏上的显示信息。控制设备上发光元件的亮灭等。

  应用程序的写报表线程流程与读报表线程类似,首先将要输出的数据按Wave Panel 规定的数据格式进行封装,复制到一个缓冲区内,再调用WriteFile()将缓冲区数据输出到Wave Panel 即可,这些信息主要是与视频帧状态变化相关的信息。

  2. 4 设备关闭

  设备关闭模块功能比较简单。当主机与WavePanel 的通讯结束时,调用CloseHandle( ) 将打开的Wave Panel 关闭即可。

  3 Wave Panel 通讯接口的设计

  以上述通讯过程为基础,设计一个名为CHid-Comm 的通讯接口,其总体框架为:

  

  其中,成员函数OpenDevice()和CloseDevice()分别用于识别。打开和关闭Wave Panel.ReadReport-Thread()用于创建读报表线程。由于线程为异步方式执行,因此ReadReportThread( ) 在调用ReadFile( ) 时要使用一个OVERLAPPED 结构变量,该变量含有一个I/ O 完成后触发事件的句柄。当HID 设备没有向主机输入数据时,事件处于无信号状态,线程被阻塞;当有数据输入时,事件被触发,线程恢复运行,接收并将数据保存在读报表缓冲区,供数据解析函数使用.WriteReportThread()与ReadReportThread( ) 的功能类似,用于创建写报表线程。

  成员变量VID.PID 和PVN 用于保存三项属性值,ReadBuffer 和WriteBuffer 分别定义读报表缓冲区和写报表缓冲区,其大小由HID 设备的输入报表和输出报表长度决定.S 实际上,该接口不仅可以用于WavePanel,同样也适用于其它HID 设备。只需要重新设置VID.PID 和PVN 值以及ReadBuffer.WriteBuffer 缓冲区的大小,而无须对识别。打开。读写报表等功能进行修改。

  图3 是主机应用程序调用CHidComm 接口实现与Wave Panel 通讯的情况。以十六进制形式输出读报表缓冲区的值,并显示控制器状态变化情况。需要注意的一个重要问题是Wave Panel 输入报表并不使用报表ID,在这种情况下应将读报表缓冲区ReadBuffer 的第0 字节设置为0×00,否则读报表线程将无法接收到输入报表。

  

  4 结束语

  Wave Panel 是一类较复杂的视频编辑HID 设备,没有提供Windows 环境下的通讯功能。基于WavePanel 对Windows 环境下的HID 设备通讯进行研究,能够解决许多UNIX.Linux.Mac 等操作系统支持的专用HID 设备无法在Windows 环境下使用的问题。较之现有的一些解决方案,设计的CHidComm 接口具有较强的通用性,并可以方便地对功能进行扩展。今后的工作主要是扩展该接口在64 位Windows 环境下的功能.


上一页 1 2 下一页

评论


技术专区

关闭