WinUSB使用控制端点0发送USB标准请求
			 2022-05-11
			  本文链接为:http://www.usbzh.com/article/detail-939.html ,欢迎转载,转载请附上本文链接。
	
			
			
			
			
		
			向默认端点发出控制请求来与设备通信。
除了与接口关联的端点外,所有 USB 设备还有一个默认端点。 默认端点的主要用途是为主机提供可用来配置设备的信息。 不过,设备还可以将默认端点用于设备特定的用途。
控制命令包含一个 8 字节设置数据包,其中包括指定特定请求的请求代码和可选的数据缓冲区。 请求代码和缓冲区格式是供应商定义的。 在此示例中,应用程序将数据发送到设备来控制灯条。 用于设置灯条的代码是0xD8,为方便起见,它定义为SET_BARGRAPH_DISPLAY。 对于此请求,设备需要一个 1 字节数据缓冲区,该缓冲区通过设置相应的位来指定应点亮哪些元素。
应用程序可以通过用户界面 (UI) 对此进行设置,例如,通过提供总数为 8 个的一组复选框控件来指定应点亮灯条的哪些元素。 指定的元素对应于缓冲区中的相应位。 为避免编写 UI 代码,此部分中的示例代码将设置位以使备用灯亮起。
分配一个 1 字节数据缓冲区,并将数据加载到通过设置相应位来指定应点亮的元素的缓冲区中。
在调用方分配的结构中构造WINUSB_SETUP_PACKET数据包。 将成员初始化,以便表示请求类型和数据,如下所示:
调用 WinUsb_ControlTransfer ,通过传递设备的 WinUSB 接口句柄、设置数据包和数据缓冲区,将请求传输到默认终结点。 该函数在 LengthTransferred 参数中接收已传输到的设备的字节数。
BOOL SendDatatoDefaultEndpoint(WINUSB_INTERFACE_HANDLE hDeviceHandle)
{
    if (hDeviceHandle==INVALID_HANDLE_VALUE)
    {
        return FALSE;
    }
    BOOL bResult = TRUE;
    UCHAR bars = 0; //bar为控制请求携带的数据
    WINUSB_SETUP_PACKET SetupPacket;
    ZeroMemory(&SetupPacket, sizeof(WINUSB_SETUP_PACKET));
    ULONG cbSent = 0;
    //Set bits to light alternate bars
    for (short i = 0; i < 7; i+= 2)
    {
        bars += 1 << i;
    }
    //Create the setup packet
    SetupPacket.RequestType = 0;
    SetupPacket.Request = 0xD8;
    SetupPacket.Value = 0;
    SetupPacket.Index = 0; 
    SetupPacket.Length = sizeof(UCHAR);
    bResult = WinUsb_ControlTransfer(hDeviceHandle, SetupPacket, &bars, sizeof(UCHAR), &cbSent, 0);
    if(!bResult)
    {
        goto done;
    }
    printf("Data sent: %d \nActual data transferred: %d.\n", sizeof(bars), cbSent);
done:
    return bResult;
}
			
			本文链接为:http://www.usbzh.com/article/detail-939.html ,欢迎转载,转载请附上本文链接。
HID人机交互QQ群:564808376   
UAC音频QQ群:218581009   
UVC相机QQ群:331552032   
BOT&UASP大容量存储QQ群:258159197   
STC-USB单片机QQ群:315457461   
USB技术交流QQ群2:580684376   
USB技术交流QQ群:952873936    
		
			WinUSB
			




