Я пытаюсь установить USB-соединение между пользовательским устройством, использующим MCP2200, и устройствами Android.
Для своих приложений я должен использовать асинхронную связь.
Пользовательское устройство должно отправлять один байт на планшет Android, а последнее должно отвечать 5 байтами. Я поместил сообщение в отдельную ветку. Вот функция run ():
public void run() {
while (usb_connected && communicating_usb) {
//reception request
readbuffer.clear();
readbuffer.rewind();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
req.initialize(connection, endpointin);
req.queue(readbuffer, 1);
connection.requestWait();
toto=readbuffer.get(0);
inbuffer="__"+Byte.toString(toto);
req.close();
if(toto==toe){//the correct value was received
received=1;//correct reception flag
tmpbuffer.clear();
tmpbuffer.rewind();
writebuffer.clear();
writebuffer.rewind();
int mocx;
int mocy;
if (perty.isOfset()) {
if (move_y > 128) mocx = move_x + 6;
else if (move_y < 127) mocx = move_x - 3;
else mocx = move_x;
} else {
mocx = move_x;
}
mocy = move_y;
if (mocx > 255) mocx = 255;
if (mocx < 0) mocx = 0;
int x1 = mocx % 16;
int x2 = (mocx - x1) / 16;
int y1 = mocy % 16;
int y2 = (mocy - y1) / 16;
int to_send=0;
if (perty.getSpeed_level() == 1) to_send= sendcount + 0x80;
else if (perty.getSpeed_level() == 2)
to_send = sendcount + 0x90;
else if (perty.getSpeed_level() == 3)
to_send = sendcount + 0xA0;
else if (perty.getSpeed_level() == 4)
to_send = sendcount + 0xB0;
tmpbuffer.putInt(to_send);
to_send = x1 + 0xC0;
tmpbuffer.putInt(to_send);
to_send = x2 + 0xD0;
tmpbuffer.putInt(to_send);
to_send = y1 + 0xE0;
tmpbuffer.putInt(to_send);
to_send = y2 + 0xF0;
tmpbuffer.putInt(to_send);
sendcount++;
if (sendcount == 16) sendcount = 0;
while(writebuffer.capacity()-writebuffer.remaining()!=0){
writebuffer.rewind();
writebuffer.clear();
}
for(int rectifier=0;rectifier<5;rectifier++){writebuffer.put(rectifier,tmpbuffer.get(3+rectifier*Integer.SIZE/Byte.SIZE));
}
reqout.initialize(connection, endpointout);
reqout.queue(writebuffer,5);
connection.requestWait();
reqout.close();
toto=0x00;
}
}
}
Этот процесс прекрасно работает с Samsung Galaxy Tab (Android 5.1.1), но он ведет себя странно с другими планшетами:
- Планшет Sony Xperia Z2 (Android 6.0.1): считываемое значение всегда равно 0. Независимо от того, что я отправляю с пользовательского устройства. Я решил эту проблему (не реальное решение, но оно заставило его работать), допустив также 0 в качестве правильного значения. Для отправки (с планшета на пользовательское устройство) я всегда получал странные значения, отправленные вместе с правильными, пока я не добавил задержку 10 мс в цикле (через функцию ожидания). Оно работало завораживающе.
- Sonny Xperia Z Ultra (Android 5.1.1): та же проблема, что и у планшета Z2, но функция задержки, похоже, не решает проблему, и я получаю только 255 на приеме и в случайное время.
- OnePlus 3 (Android 8.0.0): приложение даже не обнаруживает кабель OTG даже при включенном хранилище OTG. Пару недель назад это произошло, но сейчас, похоже, его не обнаруживают.
ПОЖАЛУЙСТА, помогите! головная боль длилась более двух недель, и у меня, похоже, нет какой-то конкретной причины, по которой все не работает.
Спасибо.