2015-08-03 76 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,那麼我會把它視爲一個有效的數據包 - 這工作完美,我成功地接收所有的數據。我確信有一個更「適當」的方式來做到這一點,但它現在適用於我。

相關問題