我正在尝试编写一些代码,以便在Win32中使用LibUsbK从同步管道中读取。我已经成功地将设备初始化为正确的状态以发送和接收等时数据,我可以在我的硬件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读取填充。
我已经检查了UsbK / OvlK函数调用中的所有错误返回值,它们都是应有的。我检查过我的缓冲区足够大,无法接收数据。
我使用非常相似的代码写入端点0x02上的ISO输出管道并且工作正常,上面的代码与我的编写代码之间唯一的区别是fwrite / memset命令被替换为调用“ fillbuffer“在调用UsbK_IsoWritePipe函数之前填充我的outBuffer的函数。
我试着查看我可以在样本中找到的任何示例以及在线但是很难理解/让他们使用我的特定设备。
任何建议或帮助都非常感激。
答案 0 :(得分:0)
所以看起来上面的代码确实有效,并且由于调试器正在中断事物的流动而被误导 - 我一直忘记尝试调试实时内容可能会引入它自己的问题。
第一个问题是,在调试器中逐步执行代码导致了低级libusbk代码捕获usb数据包并正确填充我的缓冲区的问题 - 一旦我让它全速运行并找到其他方法来测试缓冲区我确实发现那里有一些数据。
我遇到的第二个问题是缓冲区开始只是部分填充(并且从一开始就不是总是正确)所以当我检查数据时,我只是将缓冲区的第一部分打印到控制台,所以我看到的只有0xCC,因此我认为它没有工作。
一旦我意识到缓冲区后面实际上有一些数据,我就开始在数据包大小的块中查看缓冲区,如果数据包完全包含在0xCC中,我会跳过它并继续前进,但如果有的话是不是0xCC然后我会把它当作一个有效的数据包 - 这完美地工作,我成功地接收了所有的数据。我确定还有更多适当的"这样做的方式,但它现在适用于我。