Android Usb Hôte De Recevoir Des Données

J'essaie de lire les données de mon evalboard. Il est Stellaris EKK-LM4F232 Evalutaion Kit. Il dispose de cinq boutons. Je pousse sur un bouton de conseil et d'envoyer des données de mon appareil android. Par exemple, je pousse une fois, et le conseil d'administration envoyer à 1, et la deuxième fois d'envoyer à 2.... Je reçois la première valeur (1) à partir d'un appareil android lorsque j'appuie sur le bouton première fois. Mais quand j'appuie sur le bouton de nouveau, je ne peux pas recevoir d'autres valeurs comme 2 ,3 ,4 ,... .
Voici mon code pour la lecture. Il lire en continu lorsqu'il est de commencer. Pouvez-vous m'aider?

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

Si vous ne pouvez pas comprendre très bien la même question est ici posée par un
Android bulkTransfer return -1 lors de la lecture des données, mais il y a vraiment certaines données dans la mémoire tampon

Après la discusstion avec @Mike Ortiz j'ai mis tout mon code ici. Quand je clique sur le buttonSend appareil android envoyer "DÉMARRER" commande à l'appareil, puis démarrer la lecture.
Lorsque j'envoie à l'appareil android à la première valeur que je peux obtenir, mais après la première valeur, je n'obtiens aucune valeur à partir d'un périphérique usb. Je suis sûr que le périphérique usb envoie les valeurs.

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");
} 

}

Je pense que le problème ici, peut-être que vous étiez en train de lire les données trop tôt (ce qui oblige l'auditeur à obtenir les données qui peuvent ne pas avoir été envoyé encore, la lecture d'un tampon vide (d'où le -1)). Je ne vois pas où votre écouteur est défini, mais par défaut, l'auditeur peut être en cours d'exécution sur le thread principal, pas le fil que vous êtes en communication de série de l'appareil.

OriginalL'auteur Zapateus | 2013-10-09