Serial a USB Aplicación Android con dispositivo de salud

Estoy creando una aplicación de Android para permitir la comunicación de mi tablet Galaxy con un dispositivo de salud, a través de la conexión serie a USB.

¡El código que implementé no funciona! ni la comunicación OUT ni IN comienza

¿Alguien tiene alguna idea?

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(); 

¡Muchas gracias!

Antes de intentar enviar los bytes, primero debe controlar la transacción:

Utilizar:

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

y

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

Referencia:

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.