Я строю коммуникационную установку android-arduino с API-интерфейсом хоста android USB. Все работает хорошо. Arduino считывает сообщение и изменяет некоторый светодиод и отправляет обратно принятый байт. Проблема - это чтение эха от ардуино. Каждый второй ответ читает 0. Массовый вызов передачи завершается успешно, но получает только нуль. Следующее чтение возвращает символ, который ожидался в предыдущем чтении. Для примера:Android - Arduino Communication - USB-хост
Отправка | Прием
а а
б 0
а б
х 0
Я не могу положить мой палец на то, что там происходит. Может быть, кто-то может увидеть ошибку? Другой вопрос касается используемых контрольных передач (ниже). Я нашел их для разных потоков для разных ub/последовательных преобразователей. Может ли кто-нибудь сказать мне, где можно получить информацию об этих кодах и где их найти в таблицах данных?
Моя установка:
Я использую Arduino Uno изм. 3 и android 5.xx
Базовый код Arduino: светодиод реагирует на каждый отправленный символ.
void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { if (Serial.available() > 0) { char incomingByte = Serial.read(); Serial.print(incomingByte); if(incomingByte == 'a') digitalWrite(ledPin, HIGH); else if(incomingByte == 'b') digitalWrite(ledPin, LOW); } }
Android код: Я удалил TRY/поймать и отладку вещь и все, не связанное. Код выполняется в отдельном потоке. Часть «synchronized (sSendLock)» блокирует процесс до тех пор, пока поток пользовательского интерфейса не выдаст «уведомление». Используемый обработчик просто сообщает потоку пользовательского интерфейса, что значение готово.
Передача управления в начале вынимается из блога и, похоже, работает для UNO.
usb_connection.controlTransfer(0x21, 34, 0, 0, null, 0, 0);
usb_connection.controlTransfer(0x21, 32, 0, 0, new byte[] { (byte) 0x80,
0x25, 0x00, 0x00, 0x00, 0x00, 0x08 }, 7, 0);
usb_connection.controlTransfer(0x40, 0x03, 0x4138, 0, null, 0, 0);
for (;;) {
(...) synchronized (sSendLock) {
SendLock.wait(); // Thread waits, until notified
(...)
byte_buffer = new byte[1];// initialize buffer
byte_buffer[0]=(byte) data; //get data to send
usb_connection.bulkTransfer(endpOUT,byte_buffer,byte_buffer.length, 200); //send
usb_connection.bulkTransfer(endpIN,byte_buffer,byte_buffer.lenght,200);//receive
usb_connection_handler.sendMessage(Message.obtain(usb_connection_handler, 0));//notify UI Thread
}
Любые идеи? Спасибо :-)
EDIT: Я изменил код, чтобы прочитать только один бит. Он читал 5 бит раньше, чтобы проверить, как получить больше. Это не изменило поведения. Функция отправки будет выглядеть так:
public void send_char(char b) {
data =(byte) b;
synchronized (sSendLock) {
sSendLock.notify();
}
Надеюсь, что указанный фрагмент кода достаточно. Если есть какие-либо вопросы, я буду рад предоставить дополнительную информацию :-) Я действительно не знаю, как объяснить это поведение.
РЕДАКТИРОВАТЬ III: Просто, чтобы собрать информацию из комментариев:
Основная функция передачи возвращает -1, если передача не удалась, и в случае успеха, количество битов передачи. В случае, когда я получил «нуль», функция получила «нулевые» биты и не перезаписывала буфер. Нуль, который я получил из буфера, по-прежнему оставался нулевым буфером, содержащимся перед передачей.
Одна из моих основных проблем - это те передачи управления. Я нашел несколько «версий» для разных чипсетов, но я не знаю, откуда они взялись. Я не мог найти никаких требований или блок-схем об этих передачах управления в любом техническом паспорте.
Приветствия
Почему буфер приема пять байтов, где буфер отправки является одним? Мы не можем видеть, как вы показываете полученные байты. Где бы это было 0? Удалите кнопки фрагмента кода запуска и так далее. Мы также не можем видеть, откуда берутся данные. – greenapps
@greenapps sry, я забыл изменить это. Я хотел проверить, было ли больше читать и, следовательно, вмешиваться в следующую передачу. – Chuchaki
@greenapps Доброе утро. Я только что видел, что половина моего комментария не была опубликована. Извините за это ... Zero будет первым битом этих 5 байтов. Но независимо от того, сколько байтов считывается, первый бит показывает это поведение, остальные остаются равными нулю. Байт данных записывается вне потока. Функция send задает данные глобальной переменной, а затем использует sSendlock.notify(), чтобы удалить блокировку ожидания и начать передачу. Я попытаюсь удалить эти кнопки запуска. Я не был уверен, как сделать эти серые блоки кода :-). Спасибо – Chuchaki