使用函数 UsbK_IsoReadPipe 时未填充 LibsUsbK 缓冲区
LibsUsbK buffers not being filled when using function UsbK_IsoReadPipe
我正在尝试编写一些代码以在 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 函数调用的所有错误 return 值,它们都是它们应该的。我检查过我的缓冲区是否足够大以接收数据。
我使用非常相似的代码写入端点 0x02 上的 ISO 输出管道并且工作完美,上面的代码和我的写入代码之间的唯一区别是 fwrite/memset 命令被替换为在调用 UsbK_IsoWritePipe 函数之前调用填充我的 outBuffer 的 "fillbuffer" 函数。
我尝试浏览我可以在样本中和网上找到的任何示例,但努力 understand/get 它们与我的特定设备一起工作。
非常感谢任何建议或帮助。
所以看起来上面的代码确实有效,我被调试器打断了事情的流程这一事实误导了——我一直忘记尝试调试实时的东西会引入它自己的问题。
第一个问题是单步执行调试器中的代码导致低级 libusbk 代码捕获 usb 数据包并正确填充我的缓冲区 - 一旦我让它 运行 全速运行并发现其他测试缓冲区的方法我确实发现那里有一些数据。
我遇到的第二个问题是,缓冲区经常只在中途开始填充(并不总是从一开始就填满),所以当我检查数据时,我只打印了缓冲区的第一部分到控制台,所以我看到的只是 0xCC,因此我假设它没有用。
一旦我意识到缓冲区中稍后实际上有一些数据,我就开始以数据包大小的块查看缓冲区,如果数据包完全包含 0xCC,我会跳过它并继续,但如果有任何它不是 0xCC 那么我会把它当作一个有效的数据包 - 这工作得很好并且我成功地接收了所有数据。我敢肯定还有更多 "proper" 方法可以做到这一点,但它现在对我有用。
我正在尝试编写一些代码以在 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 函数调用的所有错误 return 值,它们都是它们应该的。我检查过我的缓冲区是否足够大以接收数据。
我使用非常相似的代码写入端点 0x02 上的 ISO 输出管道并且工作完美,上面的代码和我的写入代码之间的唯一区别是 fwrite/memset 命令被替换为在调用 UsbK_IsoWritePipe 函数之前调用填充我的 outBuffer 的 "fillbuffer" 函数。
我尝试浏览我可以在样本中和网上找到的任何示例,但努力 understand/get 它们与我的特定设备一起工作。
非常感谢任何建议或帮助。
所以看起来上面的代码确实有效,我被调试器打断了事情的流程这一事实误导了——我一直忘记尝试调试实时的东西会引入它自己的问题。
第一个问题是单步执行调试器中的代码导致低级 libusbk 代码捕获 usb 数据包并正确填充我的缓冲区 - 一旦我让它 运行 全速运行并发现其他测试缓冲区的方法我确实发现那里有一些数据。
我遇到的第二个问题是,缓冲区经常只在中途开始填充(并不总是从一开始就填满),所以当我检查数据时,我只打印了缓冲区的第一部分到控制台,所以我看到的只是 0xCC,因此我假设它没有用。
一旦我意识到缓冲区中稍后实际上有一些数据,我就开始以数据包大小的块查看缓冲区,如果数据包完全包含 0xCC,我会跳过它并继续,但如果有任何它不是 0xCC 那么我会把它当作一个有效的数据包 - 这工作得很好并且我成功地接收了所有数据。我敢肯定还有更多 "proper" 方法可以做到这一点,但它现在对我有用。