我試圖從基於FTDI 2232H芯片的自定義設備接收數據。Android USB主機 - bulkTransfer()丟失數據
我正在使用一個簡單的異步FIFO模式,並且傳入數據速率是3.2MB /秒。
一切工作完美與我的電腦上的測試代碼,但我遇到問題,我的東芝舒馬上收到數據。
TDI的Android驅動失敗,所以我使用Java編碼。
我可以完美地獲得95%以上的數據,但每過一段時間,數據就會「濺」出來,我會得到相同的4-5K數據的部分兩到三次,然後返回到良好的數據。
我對Thrive或Android的速度並不太快,因爲我之前的數據以雙倍(6.4MB /秒)的速度進入,而且它的速度也達到了95%。 (所以它應該沒有問題,一半的速度。)
這似乎是在Android中發生的緩衝(或雙緩衝)中的某種錯誤。 (它不是FTDI 2232H內的緩衝區,因爲重複的數據大於芯片的4K內部緩衝區。)
設置代碼很簡單,而且它的工作幾乎完美。
在數據抓取時的循環是非常簡單的:
while(!fStop)
if(totalLen < BIG_BUFF_LEN-IN_BUFF_LEN)
{
len=conn.bulkTransfer(epIN, inBuff, IN_BUFF_LEN, 0);
System.arraycopy(inBuff, 0, bigBuff, totalLen, len);
totalLen+=len;
}
如果你認爲這是對arraycopy時間延遲 - 我還是失去了數據,即使我評論說,線路輸出。
IN_BUFF_LEN是16384(即使我增加了inBuff的大小,bulkTransfer也不會返回更多值)。
bigBuff是幾兆字節。
作爲次要的問題 - 沒有人知道如何傳遞一個指針bulkTransfer將直接填充bigBuff ---在一個偏移量(未開始位置「0」
任何解決方案,這一個? – 2012-11-14 16:32:41
也許android在這段時間裏是垃圾收集,有些東西正在迷失。檢查你的logcat,看看你是否能夠在丟失數據時匹配操作系統中發生的事情。 – RightHandedMonkey 2013-01-23 02:26:23
奇怪的問題,因爲如果你使用FIFO,它永遠不會發生。因爲當你讀取一個FIFO時,數據就會消失。您是否在每次讀取FIFO之前嘗試清除緩衝區?即確保您沒有兩次讀取相同的數據,而不是從FIFO中讀出,而是在緩衝區中讀取。 – fonZ 2013-02-01 10:13:50