你說:「第二個requestWait()將阻塞,直到到達的東西,所以直到我收到東西,我不能做一套TX操作」
有我自己寫的代碼也根據您展示的例子,我想我明白你在哪裏感到困惑:第二個requestWait()將返回任何 USB操作,而不僅僅是前面的操作。 (來自Android API文檔「請注意,這可能會返回在多個UsbEndpoints上排隊的請求」)
因此,即使您在等待時排隊發送請求,您的「接收waitRequest」將會返回,但發送端點。您應該始終檢查waitRequest結果的端點,或者將它與初始請求本身進行比較。如果它匹配inRequest,那麼它實際上是您阻止的接收操作。如果它不匹配,請將它與您的發送請求進行比較(或者在下面的示例代碼中,我簡單地假設它是發送響應並忽略它)
您需要排隊發送和接收來自不同方法的請求或但是不是在你提供的代碼所隱含的同一個循環中。
下面是我自己的項目代碼(注意,我的應用程序運行到堆損壞,所以下面的代碼也許不是完美的,但它確實讓我即使在接收操作掛起發送)
所以這是我收到循環,你會看到你的代碼相似:
while(mUsbDevice != null) {
if (inRequest.queue(buffer, BUFFER_SIZE) == true) {
// (mUsbConnection.requestWait() is blocking
if (mUsbConnection.requestWait() == inRequest){
// this is an actual receive
// do receive processing here (send to conusmer)
} else{
Log.d(TAG, "mConnection.requestWait() returned for a different request (likely a send operation)");
}
} else {
Log.e(TAG, "failed to queue USB request");
}
buffer.clear();
}
我做的發送形式,使用消息隊列傳入發送請求另一個線程:
mHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) { // 1 means send a 64 bytes array in msg.obj
ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
final byte[] array = (byte[]) msg.obj;
buffer.clear();
buffer.put(array);
UsbRequest outRequest = new UsbRequest();
outRequest.initialize(mUsbConnection, mUsbEndpointOut);
outRequest.queue(buffer, BUFFER_SIZE);
Log.d(L.TAG, "Queueing request:"+outRequest);
// don't do a mConnection.requestWait() here, ReceiveThread is already listening
} else if (msg.what == 2) { // 2 means exit
Log.d(L.TAG, "SenderThread::handleMessage(): terminate");
Looper.myLooper().quit();
} else {
Log.e(L.TAG, "SenderThread::handleMessage(): unknow message type: " + msg.what);
}
}
};