我正在尝试编写一些代码,以便使用LibUsbK在Win32中从等时管道中读取。我已经成功地将设备初始化为正确的状态,以发送和接收等时数据,我可以在硬件USB分析器中看到通过USB发送的数据,但我接收到的缓冲区始终未被填充,即使分析器显示发送到PC的数据包中有数据。
我是新的LibUsbK和使用等时传输,虽然我并不是新的USB一般,但我真的一直在与此斗争。
我从设备上读取的代码是这样的.
UsbK_SelectInterface(usbHandle,1,0);
UsbK_SetAltInterface(usbHandle,1,0,1);
IsoK_Init(&isoCtx, ISO_PACKETS_PER_XFER, 0);
IsoK_SetPackets(isoCtx, ISO_PACKET_SIZE); // Size of each individual packet
OvlK_Init(&ovlPool, usbHandle, 4, 0);
OvlK_ResetPipe(usbHandle, 0x83);
OclK_Acquire(&ovlkHandle, ovlPool);
UsbK_IsoReadPipe(usbHandle, 0x83, inBuffer, sizeof(inBuffer), ovlkHandle, isoCtx);
while(!finished)
{
if(OvlK_IsComplete(ovlkHandle)
{
fwrite(inBuffer, sizeof(inBuffer), 1, outFile);
memset(inBuffer,0xcc,sizeof(inBuffer));
OvlK_ReUse(ovlkHandle);
UsbK_IsoReadPipe(usbHandle, 0x83, inBuffer, sizeof(inBuffer), ovlkHandle, isoCtx);
{
}如果我在fwrite行放置一个断点,那么inBuffer总是充满了0xCC --即,没有被iso read填充。
我检查了来自UsbK/OvlK函数调用的所有错误返回值,它们都是应该的。我已经检查了我的缓冲区是否足够大来接收数据。
我使用非常类似的代码在端点0x02上向ISO管道写入,这非常有效,上面的代码与我编写的代码之间唯一的区别是,fwrite/memset命令被替换为调用“UsbK_IsoWritePipe缓冲区”函数,该函数在调用UsbK_IsoWritePipe函数之前填充了我的UsbK_IsoWritePipe。
我试着查看我能在样本中找到的任何例子,也可以在网上找到,但我很难理解/让它们与我的特定设备一起工作。
任何建议或帮助都非常感谢。
发布于 2015-08-10 07:37:50
所以看起来上面的代码确实起了作用,我被调试器打断了事情的流程这一事实误导了--我一直忘记了,尝试调试实时的东西可能会带来它自己的问题。
第一个问题是,在调试器中执行代码会导致低级libusbk代码出现问题,该代码捕获usb数据包并正确填充缓冲区--一旦我让它全速运行,并找到其他方法测试缓冲区,我确实在其中找到了一些数据。
我遇到的第二个问题是,缓冲区通常只被部分填充(而不是从一开始就被填充),所以当我检查数据时,我只是将缓冲区的第一部分打印到控制台,所以我看到的只是0xCC,因此我假设它没有工作。
当我意识到缓冲区后面实际上有一些数据时,我就开始在数据包大小的块中查看缓冲区,如果数据包完全包含0xCC,我会跳过它并继续前进,但是如果其中任何一个不是0xCC,我就会把它当作一个有效的包来处理--这非常有效,而且我成功地接收了所有数据。我相信有一种更“适当”的方式来做这件事,但它现在对我有用。
https://stackoverflow.com/questions/31785863
复制相似问题