我以前遇到過這種問題。忘記使用Java,在後臺它做了許多阻止實時訪問的事情,例如垃圾收集,線程處理。即使在高優先級的線程中,也忘記使用事件驅動的編程,在處理事件之前可能需要很長時間,並且可能會丟失數據。
我修正它的方法是編寫「不友好」的代碼!二手C或彙編,並寫了這樣的查詢功能(在C類僞代碼):
#define PAUSE 2 /* Check twice as often as the packet rate */
#define TIMEOUT (500/PAUSE) /* Abort if half a second of no data */
/* Provide handle, data buffer and size of buffer
Returns TRUE if full buffer read, FALSE if not, data unread in size
*/
BOOL real_time_read(HANDLE handle, BYTE *data, size_t *size)
{
BOOL result = FALSE;
int timeout = TIMEOUT;
set_thread_priority(REALTIME);
while (is_handle_valid(handle))
{
if (is_data_pending(handle))
{
size_t count = get_data(handle, data, size);
data += count;
*size -= count;
if (!*size)
{
result = TRUE;
break;
}
}
else if (!--timeout)
break;
/* Give a tiny time slice to other processes */
usleep(PAUSE);
}
return result;
}
你提到你嘗試C,所以它應該是簡單的將其轉換爲真正的功能。避免使用便利功能的誘惑,你希望儘可能接近金屬。例如。如果操作系統功能Read()
又調用read()
,然後調用_read()
,則要使用_read()
。 在這種情況發生時,設備會明顯變慢,但這是實時訪問的折衷。
你有什麼類型的手機,什麼樣的Android版本等。 – PearsonArtPhoto 2012-02-23 14:58:31
兩款平板電腦,一款東芝Thrive和一款華碩變形金剛,均運行Android 3.2.1,兩者均紮根。 (對不起,我忘了在原帖中提到) – Greg 2012-02-23 19:54:21
@Greg我有完全相同的問題(http://stackoverflow.com/questions/10889461/android-usb-host-api-bulk-transfer-buffer-size )。你有沒有找到解決辦法? – syntagma 2012-06-25 07:54:47