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.
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥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()开发节拍器