Я стараюсь читать данные с моей оценки. Это 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");
}
}
Я думаю, проблема в том, что вы слишком скоро читали данные (заставляя слушателя получать данные, которые еще не были отправлены, читая пустой буфер (отсюда и -1)). Я не вижу, где ваш слушатель определен, но по умолчанию слушатель может работать в основном потоке, а не в потоке, который вы связываете с последовательным устройством. – Rachael