把“USB驱动”拆开理解。底层负责硬件的部分只管收发,确实不要求0包。但是Host确认数据接收完成并不是底层的动作,而是由Host驱动的Class部分决定的。不同的Class,对于USB数据有不同的要求,需要不同的“完成”标志。好多设备Class要求取到“0”为一个命令的结束。USB传输4字节对齐,不能被4整除的数据天然的后面就带“0”。而未满整包的受到长度制约,也可以读完。但如果收到的数据如果恰好等于包大小(USB2.0为512)的整数倍时,数据就正好没有“0”作为结尾。有点类似于C语言里找不到字符串结尾‘\0’的情况。这时就需要Device端通过发0字节包(Zero-length package,zlp)的形式为发送完成的数据补‘0’。
所以在Device端开发的时候,不能把0包的逻辑加到底层,而应该在Class层相对的Function逻辑层进行判断并发送0包,底层只要支持0数据的发送就可以了。
当然底层驱动自己发0也没错,因为大多数设备收到单独的0跟没收一样。