2016-06-08 5 views
1

Android USB 호스트 API를 사용하여 FT232를 사용하여 데이터를 보내고받습니다. 나는 보내는 부분과 읽는 부분에 두 개의 스레드를 사용하고 있습니다. 데이터를 보내고받을 수 있지만 읽은 데이터가 데이터가 보낸 것과 같지 않습니다. 예를 들어, 바이트 [1, 2, 3, 4, 5]를 보낼 때. 읽혀지는 데이터는 때때로 byte [1, 2, 5]이다. 경우에 따라 5 바이트를 읽을 수 있지만 때로는 일부 바이트가 손실 될 수 있습니다. 첨부 된 코드는 제가 사용하고 있습니다.Android USB가 bulkTransfer를 통해 전체 데이터를 읽을 수 없습니다.

설정 부분 :

HashMap<String, UsbDevice> list = mUsbManager.getDeviceList(); 
Iterator<UsbDevice> iterator = list.values().iterator(); 
while(iterator.hasNext()) { 
    UsbDevice device = iterator.next(); 
    if (device.getInterfaceCount() == 1) { 
     mInterface = device.getInterface(0); 
     for (int i = 0; i < mInterface.getEndpointCount(); i++) { 
      if (mInterface.getEndpoint(i).getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { 
       if (mInterface.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN) { 
        mEndpointIn = mInterface.getEndpoint(i); 
       } else { 
        mEndpointOut = mInterface.getEndpoint(i); 
       } 
      } 
          } 
        } 
       } 
      } 
     } 

보내기 부분 :

UsbDeviceConnection connection = mUsbManager.openDevice(device); 
if (connection == null) { 
    Log.e(TAG, "Connection terminated"); 
    return; 
} 
byte[] bytes = new byte[1, 2, 3, 4, 5]; 
boolean claimed = connection.claimInterface(mInterface, true); 
if (claimed) { 
    connection.controlTransfer(0x40, 0x03, 0x0034, 0, null, 0, 0); // baud rate 57600 
    connection.controlTransfer(0x40, 0x04, 0x0008, 0, null, 0, 0); // 8-N-1 
    int sentLength = connection.bulkTransfer(mEndpointOut, bytes, bytes.length, 100); 
    connection.releaseInterface(mInterface); 
    connection.close(); 
} 

읽기 부분 :이 문제를 해결 안드로이드에 대한 라이브러리를 발견

UsbDeviceConnection connection = mUsbManager.openDevice(device); 
if (connection == null) { 
    Log.e(TAG, "Connection terminated"); 
    return; 
} 
byte[] inData = new byte[64]; 
boolean claimed = connection.claimInterface(mInterface, true); 
if (claimed) { 
    connection.controlTransfer(0x40, 0x03, 0x0034, 0, null, 0, 0); // baud rate 57600 
    connection.controlTransfer(0x40, 0x04, 0x0008, 0, null, 0, 0); // 8-N-1 
    int readLength = connection.bulkTransfer(mEndpointIn, inData, inData.length, 100); 
    connection.releaseInterface(mInterface); 
    connection.close(); 
    // 'result' is the data I want, the first 2 bytes are status bytes so being removed 
    byte[] result = new byte[inData.length - 2]; 
    System.arrayCopy(inData, 2, result, 0, inData.length - 2); 
} 

답변

0

. 동일한 문제가있는 사람에게 도움이되기를 바랍니다.

UsbSerial