2013-10-09 3 views
4

Я стараюсь читать данные с моей оценки. Это Stellaris EKK-LM4F232 Evalutaion Kit. Он имеет пять кнопок. Я нажимаю кнопку на борту и отправляю данные на свое устройство Android. Например, я нажимаю один раз, а доска посылает на 1, а второй раз посылает на 2 .... Я получаю первое значение (это значение 1) из устройства Android, когда я нажимаю кнопку в первый раз. Но когда я снова нажимаю кнопку, я не могу получить никаких других значений, таких как 2, 3, 4, .... Вот мой код для чтения. Он читается непрерывно, когда он запускается. Вы можете мне помочь?Android Usb Host Получить данные

public void startDataRecieve() { 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 

      UsbEndpoint endpoint = null; 

      for (int i = 0; i < intf.getEndpointCount(); i++) { 
       if (intf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN) { 
        endpoint = intf.getEndpoint(i); 
        break; 
       } 
      } 
      UsbRequest request = new UsbRequest(); // create an URB 
      boolean initilzed = request.initialize(connection, endpoint); 

      if (!initilzed) { 
       Log.e("USB CONNECTION FAILED", "Request initialization failed for reading"); 
       return; 
      } 
      while (true) { 
       int bufferMaxLength = endpoint.getMaxPacketSize(); 
       ByteBuffer buffer = ByteBuffer.allocate(bufferMaxLength); 


       if (request.queue(buffer, bufferMaxLength) == true) { 
        if (connection.requestWait() == request) { 
         String result = new String(buffer.array()); 
          Log.i("GELEN DATA : ", result); 
          listener.readData(result); 
        } 
       } 
      } 

     } 
    }).start(); 
} 

Если вы не можете понять, очень хорошо и тот же вопрос здесь задают один Android bulkTransfer return -1 when read data but there is really some data in the buffer

После discusstion с Ортисом @ Mike Я поставил все мой код здесь. Когда я нажимаю кнопкуОтправить устройство Android, отправьте команду «СТАРТ» на устройство, а затем начните чтение. Когда я отправляю на Android-устройство первое значение, я могу его получить, но после первого значения я не получаю никакого значения от устройства usb. Я уверен, что устройство usb отправляет значения.

public class MainActivity extends Activity implements Runnable { 

private static final String TAG = "MAIN ACTIVITY TEST "; 

private Button buttonConnect; 
private Button butonSend; 
private Button buttonDisconnect; 
private TextView textViewResult; 
private UsbDevice device; 

private Thread readThread; 
private UsbManager usbManager; 
private UsbDeviceConnection connection; 
private UsbInterface usbInterface; 
private UsbEndpoint usbEndpointIn; 
private UsbEndpoint usbEndpointOut; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    initView(); 

    PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); 
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
    registerReceiver(usbReceiver, filter); 

    usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
    HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList(); 
    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 

    while (deviceIterator.hasNext()) { 
     UsbDevice device = deviceIterator.next(); 

     if (device.getVendorId() == 7358 && device.getProductId() == 3) { 
      this.device = device; 
      usbManager.requestPermission(device, mPermissionIntent); 
      break; 
     } 
    } 

    butonSend.setOnClickListener(new OnClickListener() { 


     @Override 
     public void onClick(View v) { 
      usbInterface = device.getInterface(0); 
      connection = usbManager.openDevice(device); 
      connection.claimInterface(usbInterface, false); 

      for (int i = 0; i < usbInterface.getEndpointCount(); i++) { 
       UsbEndpoint end = usbInterface.getEndpoint(i); 
       if (end.getDirection() == UsbConstants.USB_DIR_IN) { 
        usbEndpointIn = end; 

       } else { 
        usbEndpointOut = end; 
       } 
      } 

      //SEND START COMMAND TO THE USB DEVICE; 
      int result = connection.bulkTransfer(usbEndpointOut, "START".getBytes(), "START".getBytes().length, 1000); 
      Log.e("SEND RESULT", result + ""); 


      //START READING in run method 
      readThread = new Thread(MainActivity.this); 
      readThread.start(); 




     } 
    }); 

    buttonDisconnect.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      mRunning = false; 
      //readThread.stop(); 
      connection.releaseInterface(usbInterface); 
      connection.close(); 
      Log.e(TAG, "Connection CLosed."); 

     } 
    }); 
} 

private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; 
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() { 

    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (ACTION_USB_PERMISSION.equals(action)) { 
      synchronized (this) { 
       UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 

       if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
        if (device != null) { 
         Toast.makeText(MainActivity.this, "Cihaza izin verildi", Toast.LENGTH_LONG).show(); 
        } 
       } else { 
        Toast.makeText(MainActivity.this, "Cihaza izin verilmedi.", Toast.LENGTH_LONG).show(); 
        Log.d(TAG, "permission denied for device " + device); 
       } 
      } 
     } 
    } 
}; 

private boolean mRunning; 

private void initView() { 
    butonSend = (Button) findViewById(R.id.buttonSend); 
    buttonConnect = (Button) findViewById(R.id.buttonConnect); 
    textViewResult = (TextView) findViewById(R.id.textViewResult); 
    buttonDisconnect = (Button) findViewById(R.id.buttonDisconnect); 
} 

@Override 
public void run() { 
    mRunning = true; 

    //READ VALUE UNTIL DISCONNECT 
    while (mRunning) { 

     byte[] bytes = new byte[usbEndpointIn.getMaxPacketSize()]; 
     int result = connection.bulkTransfer(usbEndpointIn, bytes, bytes.length, 1000); 
     if(result > 0) 
     Log.e("RESULT : " + result, " VALUE : " + new String(bytes)); 


    } 
    Log.d("Thread", "STOPPPED"); 

} 

}

+0

Я думаю, проблема в том, что вы слишком скоро читали данные (заставляя слушателя получать данные, которые еще не были отправлены, читая пустой буфер (отсюда и -1)). Я не вижу, где ваш слушатель определен, но по умолчанию слушатель может работать в основном потоке, а не в потоке, который вы связываете с последовательным устройством. – Rachael

ответ

4

Какое условие не выполняется в цикле? (request.queue(buffer, bufferMaxLength) == true) или (connection.requestWait() == request)? Если это вторая, я могу предложить использовать .equals() вместо сравнения ссылок ==.

Вы пытались использовать массовый перевод вместо запросов?

private UsbManager mManager; 
private UsbDevice mDevice; 
private UsbDeviceConnection mDeviceConnection; 
private UsbInterface mInterface; 
private UsbEndpoint mEndpointIn; 

public void run() { 
    while (mEndpointIn != null && mDeviceConnection != null) { 
     byte[] recordIn = new byte[mEndpointIn.getMaxPacketSize()]; 
     int receivedLength = mDeviceConnection.bulkTransfer(mEndpointIn, recordIn, 
                 recordIn.length, mTimeout); 
     if (receivedLength > -1) passDataToListener(recordIn); 
    } 
} 

public void initializeCommunication(Context context) throws UsbDeviceException { 

    mInterface = findHidInterface(); 

    if (mManager != null && mDevice != null && mInterface != null) { 
     mDeviceConnection = mManager.openDevice(mDevice); 

     if (mDeviceConnection != null) { 
      if (mDeviceConnection.claimInterface(mInterface, true)) { 
       UsbEndpoint usbEndpointOut = null; 
       UsbEndpoint usbEndpointIn = null; 

       // 
       // Look for Interrupt endpoints 
       // 
       for (int i = 0; i < mInterface.getEndpointCount(); i++) { 
        UsbEndpoint usbEndpoint = mInterface.getEndpoint(i); 

        if (usbEndpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_INT) { 
         if (usbEndpoint.getDirection() == UsbConstants.USB_DIR_OUT) { 
          usbEndpointOut = usbEndpoint; 

         } else { 
          usbEndpointIn = usbEndpoint; 
         } 
        } 
       } 

       if (usbEndpointOut == null || usbEndpointIn == null) { 
        Log.w(DEBUG, "No USB endpoints found."); 
       } 

       mEndpointOut = usbEndpointOut; 
       mEndpointIn = usbEndpointIn; 

      } else { 
       mDeviceConnection.close(); 
       Log.w(DEBUG, "USB claim interface failed."); 
      } 
     } else { 
      Log.w(DEBUG, "USB open device failed."); 
     } 
    } else { 
     Log.w(DEBUG, "Some essential USB variables were null."); 
    } 
} 

/** 
* Find the HID interface. 
* 
* @return 
*  Return the HID interface if found, otherwise null. 
*/ 
private UsbInterface findHidInterface() { 
    if (mDevice != null) { 
     final int interfaceCount = mDevice.getInterfaceCount(); 

     for (int interfaceIndex = 0; interfaceIndex < interfaceCount; interfaceIndex++) { 
      UsbInterface usbInterface = mDevice.getInterface(interfaceIndex); 

      // 
      // Can add UsbInterface.getInterfaceSubclass() and 
      // UsbInterface.getInterfaceProtocol() for more specifics. 
      // 

      if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_HID) { 
       return usbInterface; 
      } 
     } 

     Log.w(DEBUG, "HID interface not found."); 
    } 

    return null; 
} 
+0

проблема (connection.requestWait() == запрос). Но я могу получить первое значение. Например, я посылаю 1 первый раз с устройства USB. Я могу получить его, но второй раз, когда я отправляю 2, я не принимаю значение в устройстве Android. Если это условие неверно, почему он работает, когда я получаю первое значение? – Zapateus

+0

Я попробовал ваше решение с bulktransfer receivedLenght всегда возвращает -1 после получения первого значения. – Zapateus

+0

Интересно, я использую аналогичный код для того, что я разместил в своем собственном проекте, и он работает для нескольких сообщений. Следующим моим предложением было бы использовать USB-анализатор для подтверждения того, что комплект фактически отправляет данные на телефон после первой нажатия кнопки. –

Смежные вопросы