【问题标题】:LibsUsbK buffers not being filled when using function UsbK_IsoReadPipe使用函数 UsbK_IsoReadPipe 时未填充 LibsUsbK 缓冲区
【发布时间】:2015-08-03 11:18:16
【问题描述】:

我正在尝试编写一些代码以使用 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 命令被替换为对“在调用 UsbK_IsoWritePipe 函数之前填充我的 outBuffer 的函数。

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

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

【问题讨论】:

  • “是这样的”是一个问题。您需要实际代码或此处代码的帮助吗?

标签: c++ winapi usb iso libusbk


【解决方案1】:

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

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

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

一旦我意识到缓冲区中实际上有一些数据,我就开始以数据包大小的块查看缓冲区,如果数据包完全包含 0xCC,我会跳过它并继续前进,但如果其中任何一个是不是 0xCC,那么我会将其视为有效数据包 - 这非常有效,并且我成功接收了所有数据。我确信有一种更“正确”的方法可以做到这一点,但它现在对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2011-02-20
    • 2017-01-05
    • 1970-01-01
    • 2013-06-12
    • 2013-02-21
    相关资源
    最近更新 更多