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


1 ответ


0

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

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

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

,