lmg11123 2023-02-09 14:51 采纳率: 0%
浏览 26

usb设备批量传输如何实现流控

usb设备批量传输如何实现流控?
比如按键按下不接收数据,主机等待,
按键键值反转,继续接收没接收完的数据

  • 写回答

3条回答 默认 最新

  • TTSGXTY 2023-02-09 16:52
    关注

    在USB设备批量传输中,流控通常是通过实现USB协议中的流控机制来实现的。

    USB协议中有两个常用的流控机制:Nak(Negative Acknowledge)和Stall(拒绝)。

    Nak:当USB设备不能接收主机发送的数据时,它可以发送NAK响应,表示当前不能接收数据。
    Stall:当USB设备不能处理主机的请求时,它可以发送STALL响应,表示当前请求无法处理。
    如果你想实现按键按下时不接收数据,可以在按键按下时发送NAK响应,等按键键值反转时再发送ACK响应。这样主机就会等待,等待按键反转后再继续接收没接收完的数据。

    using System;
    using System.Threading;
    using Microsoft.Win32.SafeHandles;
    using System.Runtime.InteropServices;
    
    namespace UsbFlowControl
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Open a handle to the USB device
                SafeFileHandle deviceHandle = WinUsb_Functions.CreateFile(@"\\.\ExampleDevice",
                    FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open,
                    WinUsb_Functions.FILE_ATTRIBUTE_NORMAL | WinUsb_Functions.FILE_FLAG_OVERLAPPED, IntPtr.Zero);
    
                if (deviceHandle.IsInvalid)
                {
                    Console.WriteLine("Error opening handle to the USB device");
                    return;
                }
    
                // Initialize WinUSB
                IntPtr winUsbHandle;
                bool success = WinUsb_Functions.WinUsb_Initialize(deviceHandle, out winUsbHandle);
                if (!success)
                {
                    Console.WriteLine("Error initializing WinUSB");
                    return;
                }
    
                // Get the USB device endpoint addresses
                WinUsb_Functions.WINUSB_PIPE_INFORMATION pipeIn;
                WinUsb_Functions.WINUSB_PIPE_INFORMATION pipeOut;
                success = WinUsb_Functions.WinUsb_GetPipePolicy(winUsbHandle, WinUsb_Functions.PIPE_ID.PIPE_ID_IN, out pipeIn);
                if (!success)
                {
                    Console.WriteLine("Error getting input pipe policy");
                    return;
                }
                success = WinUsb_Functions.WinUsb_GetPipePolicy(winUsbHandle, WinUsb_Functions.PIPE_ID.PIPE_ID_OUT, out pipeOut);
                if (!success)
                {
                    Console.WriteLine("Error getting output pipe policy");
                    return;
                }
    
                // Start the transfer loop
                byte[] buffer = new byte[64];
                Overlapped overlapped = new Overlapped();
                AutoResetEvent eventHandle = new AutoResetEvent(false);
                while (true)
                {
                    // Check if the button is pressed
                    if (ButtonIsPressed())
                    {
                        Console.WriteLine("Button is pressed. Waiting for release...");
                        continue;
                    }
    
                    // Read data from the USB device
                    overlapped.EventHandle = eventHandle.
    
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 2月9日

悬赏问题

  • ¥15 python点云生成mesh精度不够怎么办
  • ¥15 QT C++ 鼠标键盘通信
  • ¥15 改进Yolov8时添加的注意力模块在task.py里检测不到
  • ¥50 高维数据处理方法求指导
  • ¥100 数字取证课程 关于FAT文件系统的操作
  • ¥15 如何使用js实现打印时每页设置统一的标题
  • ¥15 安装TIA PortalV15.1报错
  • ¥15 能把水桶搬到饮水机的机械设计
  • ¥15 Android Studio中如何把H5逻辑放在Assets 文件夹中以实现将h5代码打包为apk
  • ¥15 使用小程序wx.createWebAudioContext()开发节拍器