0

我正在尝试编写一些代码以在 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。

我尝试查看可以在示例和在线中找到的任何示例,但很难理解/让它们与我的特定设备一起使用。

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

4

1 回答 1

0

所以看起来上面的代码确实有效,我被调试器中断了事情的流程这一事实误导了——我一直忘记尝试调试实时的东西可能会引入它自己的问题。

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

我遇到的第二个问题是,缓冲区通常只是在中途开始填充(并不总是从一开始就填满),所以当我检查数据时,我只是将缓冲区的第一部分打印到控制台,所以我看到的只是 0xCC,因此我假设它没有工作。

一旦我意识到缓冲区中实际上有一些数据,我就开始以数据包大小的块查看缓冲区,如果数据包完全包含 0xCC 我会跳过它并继续前进,但如果其中任何一个不是 0xCC 然后我会把它当作一个有效的数据包——这工作得很好,我成功地接收到了所有的数据。我确信有一种更“正确”的方法可以做到这一点,但它现在对我有用。

于 2015-08-10T07:37:50.767 回答