2015-08-03 75 views
0

我试图编写一些代码来从Win32中使用LibUsbK读取同步管道。我已经成功地将设备初始化为正确的状态以发送和接收同步数据,并且我可以看到通过我的硬件USB分析器中的USB发送的数据,但是我收到的缓冲区始终未填充,即使分析仪显示有数据在发送到PC的数据包中。当使用函数时,LibsUsbK缓冲区未被填充UsbK_IsoReadPipe

我是新来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命令被替换为对在调用UsbK_IsoWritePipe函数之前填充我的outBuffer的“fillbuffer”函数。

我试着找过任何的例子我能找到的样品中,也在线,但努力去理解/让他们与我的特定设备正常工作。

任何建议或帮助非常感谢。

+1

“是这样的”是一个问题。你想在这里得到实际的代码或代码的帮助吗? –

回答

0

这样看来,上面的代码所做的工作,我被一个事实,即调试器中断的东西流误导 - 我一直忘了要调试实时的东西可以推出它自己的问题。

第一个问题是,在调试器中单步执行代码会导致低级别libusbk代码捕获usb数据包并正确填充我的缓冲区 - 一旦我让它全速运行并找到其他方法来测试缓冲区我确实发现里面有一些数据。

我遇到的第二个问题是,经常缓冲区开始被填满(并且始终不是正确的),所以当我检查数据时,我只是将缓冲区的第一部分打印到控制台,所以我看到的只是0xCC,因此我认为它没有工作。

一旦我意识到后面实际上有一些数据在缓冲区中,我刚开始在包大小的块中查看缓冲区,如果数据包完全包含0xCC,我会跳过它并继续前进,但如果有的话不是0xCC,那么我会把它视为一个有效的数据包 - 这工作完美,我成功地接收所有的数据。我确信有一个更“适当”的方式来做到这一点,但它现在适用于我。

相关问题