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");
}
}
OriginalL'auteur Zapateus | 2013-10-09
Vous devez vous connecter pour publier un commentaire.
De la condition qui échoue dans votre boucle?
(request.queue(buffer, bufferMaxLength) == true)
ou(connection.requestWait() == request)
? Si c'est la deuxième, je pourrais suggérer à l'aide de.equals()
au lieu de la référence de comparaison==
.Avez-vous essayé d'utiliser le transfert en bloc au lieu de demandes?
J'ai essayé votre solution avec bulktransfer la receivedLenght toujours retourner -1 après je reçois première valeur.
Intéressant, j'ai utiliser un code similaire à ce que j'ai posté dans un projet de mon propre gré, et il travaille pour plusieurs messages. Ma prochaine suggestion serait d'utiliser un port USB de l'Analyseur pour confirmer le kit est en fait l'envoi de données vers le téléphone après la première pression sur la touche.
J'ai ajouté un lien dans ma question, vous pouvez voir le même problème avec moi. Vous pouvez peut-être trouver une autre solution. Merci pour tout
Pouvez-vous poster le reste de votre code? Appelez-vous
mDeviceCommunication.claimInterface(intf, true);
, etc? Êtes-vous de la communication sur le bon type d'interface? Je crois que vous voulez être à la recherche d'un HID de l'interface, en particulier, et seulement les points de terminaison de l'interface. Vous pouvez télécharger l'application "USB Device Info" pour énumérer les points de terminaison et les interfaces de votre périphérique usb.OriginalL'auteur Mike Ortiz