Digispark: проверьте, подключен ли USB-хост

Я пытаюсь определить, действительно ли устройство digispark подключено к хосту (т. е. линия USB «активна»), а не только что включена. Проблема: если я отправляю нажатие клавиши при отключенной линии данных, код постоянно зависает в sendKeyPress. Моя теория состоит в том, что он продолжает зацикливаться, ожидая готовности USB, и это имеет смысл.

    while (!usbInterruptIsReady()) {
      // Примечание: мы ждем, пока не сможем отправить keyPress
      // так мы знаем, что предыдущее нажатие клавиши было
      // отправил.
        usbPoll();
        _delay_ms(5);
    }

Я пытался использовать макрос usbInterruptIsReady() перед вызовом sendKeyStroke в main, но безуспешно. Я ожидал увидеть функцию, которая отслеживает это состояние, но, видимо, ее нет.

Кроме того: то, чего я пытаюсь добиться, не кажется чем-то очень странным, поэтому я ожидаю, что кто-то другой мог наткнуться на это и найти разумный обходной путь. Я бы не хотел настраивать сторожевой таймер.

Пример приведенного ниже кода зависает, когда устройство включено, но не подключено к ПК. Спасибо

Справочная информация: https://hackaday.io/project/191762-automatic-workstation-locker

#include "DigiKeyboard.h"
#include "Arduino.h"

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  DigiKeyboard.update();

  DigiKeyboard.sendKeyStroke(0);
}

void loop() {
  static uint8_t bit = 0;
  bit = 1 - bit;
  digitalWrite(LED_BUILTIN, bit);
  DigiKeyboard.update();
  DigiKeyboard.sendKeyStroke(KEY_Q);
  delay(2000);
}

, 👍-1

Обсуждение

Я удалил все комментарии, дошедшие до санок. Помните, что комментарии под вопросом предназначены для его разъяснения, а не для нападок друг на друга., @Nick Gammon

Если вы хотите пожаловаться на работу этого сайта, поднимите проблему на [нашем мета-сайте](https://arduino.meta.stackexchange.com/)., @Nick Gammon

Мне вопрос кажется разумным, однако @Paperino, вам не следует повторять один и тот же вопрос. Постарайтесь сохранить оригинал, где это возможно. Поскольку сейчас он удален, я предлагаю воспользоваться этим., @Nick Gammon


2 ответа


1

Digispark не имеет надлежащей аппаратной реализации USB. Вполне возможно, что вы просто не можете сделать то, что пытаетесь сделать. Поиск, который я провел, показал, что вы не единственный, кто пытается это сделать.

Возможно, вы захотите переключиться на одну из плат Arduino с аппаратным интерфейсом USB, например Leonardo или Micro.

Я должен отметить, что Digispark не является Arduino, и у него есть собственный форум, где вы можете получить ответ свое собственное сообщество.

,

1

Возможно, я немного опоздал, но мне тоже понадобился такой же проект, и я смог его запустить с помощью макроса usbInterruptIsReady(). Этот макрос проверяет глобальное значение, используемое другими компонентами, поэтому его нужно опрашивать некоторое время, прежде чем он выдаст корректный результат.

Вот простой скетч, который, кажется, работает надежно и определяет, подключен ли хост к USB:

// Включить библиотеку клавиатуры независимо от доступности USB.
#include "DigiKeyboard.h"

// Переменная для хранения состояния USB-подключения.
bool is_usb = false;

void setup()
{
  // Начинаем отсчет времени.
  uint32_t start = millis();

  // Подождите, пока не пройдет 1000 мс или не будет обнаружен USB-хост.
  // Я тестировал с тайм-аутом менее 1000 мс, но это было ненадежно.
  while (((millis() - start) <= 1000) && !is_usb)
  {
    // Проверьте доступность USB.
    is_usb = usbInterruptIsReady();
    // Используйте функцию задержки библиотеки клавиатуры для продолжения вызова usbPoll().
    DigiKeyboard.delay(5);
  }

  // Для всех вызовов клавиатуры всегда сначала проверяйте, подключен ли хост,
  // в противном случае соединение может оборваться, и вы попадете в одну из многих
  // бесконечные циклы в библиотеках Digispark.
  if (is_usb)
  {
    // Отправьте нажатие клавиши «clear» в setup() вместо loop(), чтобы разрешить
    // улучшенное управление с клавиатуры.
    DigiKeyboard.sendKeyStroke(0);
  }
}
,

ОТ: boolean == false — это запах кода, лучше используйте !boolean., @the busybee

Называть это конкретно «запахом кода» неправильно. Проблема в том, что я не проводил последовательного и явного сравнения. Я отредактирую ответ, чтобы сделать его более последовательным., @ÉmileBV