首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用函数LibsUsbK时未填充UsbK_IsoReadPipe缓冲区

使用函数LibsUsbK时未填充UsbK_IsoReadPipe缓冲区
EN

Stack Overflow用户
提问于 2015-08-03 11:18:16
回答 1查看 162关注 0票数 0

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

我是新的LibUsbK和使用等时传输,虽然我并不是新的USB一般,但我真的一直在与此斗争。

我从设备上读取的代码是这样的.

代码语言:javascript
复制
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。

我试着查看我能在样本中找到的任何例子,也可以在网上找到,但我很难理解/让它们与我的特定设备一起工作。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-10 07:37:50

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

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

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

当我意识到缓冲区后面实际上有一些数据时,我就开始在数据包大小的块中查看缓冲区,如果数据包完全包含0xCC,我会跳过它并继续前进,但是如果其中任何一个不是0xCC,我就会把它当作一个有效的包来处理--这非常有效,而且我成功地接收了所有数据。我相信有一种更“适当”的方式来做这件事,但它现在对我有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31785863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档