2012-10-01 164 views
4

我正在創建一個Android應用程序,以便通過串行連接到USB連接讓我的Galaxy Tablet與健康設備通信。使用健康設備連接到USB Android應用程序

我實施的代碼不起作用! OUT和IN通信都不啓動

有人有什麼想法嗎?

public void recordData(View _view){ 
    text = (TextView)findViewById(R.id.textView1); 





    manager=(UsbManager) getSystemService(Context.USB_SERVICE); 

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


    HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); 
    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 
    while(deviceIterator.hasNext()){ 
     UsbDevice device = deviceIterator.next(); 
     manager.requestPermission(device, mPermissionIntent); 
     text.setText(text.getText()+"\n"+device.getDeviceName()); 
    } 


} 


private UsbManager manager=null; 

private boolean forceClaim = true; 
private UsbDeviceConnection connection; 
private UsbEndpoint input = null,output=null; 
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; 
    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { 

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

        if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
         if(device != null){ 
          //call method to set up device communication 
          UsbInterface intf = device.getInterface(0); 
          connection = manager.openDevice(device); 
          connection.claimInterface(intf, forceClaim); 

          //connection settings 
          int op= connection.controlTransfer(0x40, 0, 0, 0, null, 0, 0);// reset //0x40 
          int op2= connection.controlTransfer(0x40, 0, 1, 0, null, 0, 0);//clear Rx 
          int op3= connection.controlTransfer(0x40, 0, 2, 0, null, 0, 0);// clear Tx 
          int op3b= connection.controlTransfer(0x40, 0x02, 0x0000, 0, null, 0, 0);//control flow 

          int op4= connection.controlTransfer(0x40, 0x03, 0x001A, 0, null, 0, 0);// baud rate 115200 
          int op5= connection.controlTransfer(0x40, 0x04, 0x0008, 0, null, 0, 0);//8 bit 

          int endPts = intf.getEndpointCount(); 

          for(int e = 0; e < endPts; e++){ 
           UsbEndpoint endpoint = intf.getEndpoint(e); 
           endpoint.getAttributes(); 

           if(endpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK){ 
            if(endpoint.getDirection() == UsbConstants.USB_DIR_IN){ 
             input = endpoint; 
             Log.d("Endpoint", "Got input"); 

            }else if(endpoint.getDirection() == UsbConstants.USB_DIR_OUT){ 
             output = endpoint; 
             Log.d("Endpoint", "Got output"); 
            }      
           } 
          } 



          text.setText(text.getText()+"\nOut= "+String.valueOf(output.getEndpointNumber())); 
          text.setText(text.getText()+"\nIn= "+String.valueOf(input.getEndpointNumber())); 


          byte [] buffer = {77}; // M\n in ascii 
          for (int i = 0; i < buffer.length; ++i) 
          { 
           connection.bulkTransfer(output, new byte[] {buffer[i]}, 1, 0); 
          } 



          read(); 

         } 
        } 
        else { 
         //error 
        } 
       } 
      } 
     } 
    }; 

//read thread 
    private void read() { 
     Runnable r = new Runnable() { 
      byte[] buffer = new byte[64]; 
      byte[] buffer2; 
      public void run() { 
       while (isRecording) { 
        { 
         int op = connection.bulkTransfer(input, buffer, 64, 0); 

         if (op > 2) { 
          buffer2 = new byte[op]; 
          for (int i = 0; i < op - 2; ++i) { 
           buffer2[i] = buffer[i+2]; 
           text.setText(text.getText()+"\n"+String.valueOf(buffer2[i])); 
          } 

         } 
        } 

       } 
      } 
     }; 
     Thread t = new Thread(r); 
     t.start(); 

非常感謝!

+0

什麼錯誤信息,你在logcat中看到了什麼? – HitOdessit

回答

0

之前想送你必須首先控制事務的字節:

用途:

// for writing to USB with 9600 baudrate 
connection.controlTransfer(0x00000000, 0x03, 0x4138, 0, null, 0, 0); 

// for reading from USB with 9600 baudrate 
connection.controlTransfer(0x00000080, 0x03, 0x4138, 0, null, 0, 0); 

參考:

+0

我有一個條碼掃描器,有一個批量傳輸IN端點。每當我嘗試進行controlTransfer調用時,它總是返回-1。這是一個已知的問題嗎?我無法從此設備讀取任何內容。 – scheibk

+0

我認爲你必須定義你正在用來閱讀的設備類型,檢查下面的鏈接可能會幫助你解決問題[鏈接](http://www.usb.org/developers/defined_class) –