我正在为与 WinUSB 主机通信的 USB 2.0 全速设备编写固件,每个方向都有一个 Bulk Pipe。设备何时应发送零长度数据包 (ZLP) 以终止 IN 传输,它如何知道它应该发送?
USB 2.0 规范的第 5.8.3 节说:
当端点执行以下操作之一时,批量传输完成:
- 已准确传输预期的数据量
- 传输有效载荷大小小于 wMaxPacketSize 的数据包或传输零长度数据包 [ZLP]
我将其解释为,当传输大小是最大数据包大小的整数倍时,应该发送 ZLP,并且传输的“预期”大小大于实际大小(即可以发送的大小)。但是接收者如何知道预期的结果?
例如,我在 C# 中使用WinUSBNet包装器。当我像这样从管道中读取
int bytesRead;
buffer = new byte[128];
try
{
bytesRead = m_PipeIN.Read(buffer);
buffer = buffer.Take(bytesRead).ToArray();
}
该库像这样调用WinUsb_ReadPipe():
WinUsb_ReadPipe(InterfaceHandle(ifaceIndex),
pipeID,
pBuffer + offset,
(uint)bytesToRead,
out bytesRead,
IntPtr.Zero);
假设设备正好有 128 个字节要发送,最大数据包大小为 64 个字节。设备如何确定主机“期望”什么,因此它是否应该发送 ZLP 来终止传输?
(类似于这个问题,但那个问题是关于控制管道的。我问的是散装管道。)