2016-04-12 2 views
0

Я строю коммуникационную установку 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

Почему буфер приема пять байтов, где буфер отправки является одним? Мы не можем видеть, как вы показываете полученные байты. Где бы это было 0? Удалите кнопки фрагмента кода запуска и так далее. Мы также не можем видеть, откуда берутся данные. – greenapps

+0

@greenapps sry, я забыл изменить это. Я хотел проверить, было ли больше читать и, следовательно, вмешиваться в следующую передачу. – Chuchaki

+0

@greenapps Доброе утро. Я только что видел, что половина моего комментария не была опубликована. Извините за это ... Zero будет первым битом этих 5 байтов. Но независимо от того, сколько байтов считывается, первый бит показывает это поведение, остальные остаются равными нулю. Байт данных записывается вне потока. Функция send задает данные глобальной переменной, а затем использует sSendlock.notify(), чтобы удалить блокировку ожидания и начать передачу. Я попытаюсь удалить эти кнопки запуска. Я не был уверен, как сделать эти серые блоки кода :-). Спасибо – Chuchaki

ответ

0

@greenapps нашел ошибку. Поскольку это асинхронная передача данных и время устройства Arduino неизвестно, необходимо повторить bulktransfer, пока что-то не будет получено. Я использовал цикл for с некоторыми итерациями. Как только возвращаемое значение объемного переноса отличается от одного, я выхожу из цикла и продолжаю.

Благодарим за помощь