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);
}
@Paperino, 👍-1
Обсуждение2 ответа
Digispark не имеет надлежащей аппаратной реализации USB. Вполне возможно, что вы просто не можете сделать то, что пытаетесь сделать. Поиск, который я провел, показал, что вы не единственный, кто пытается это сделать.
Возможно, вы захотите переключиться на одну из плат Arduino с аппаратным интерфейсом USB, например Leonardo или Micro.
Я должен отметить, что Digispark не является Arduino, и у него есть собственный форум, где вы можете получить ответ свое собственное сообщество.
Возможно, я немного опоздал, но мне тоже понадобился такой же проект, и я смог его запустить с помощью макроса 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
- Связь последовательного порта Digispark
- Digispark / DigiKeyboard изменить раскладку клавиатуры
- Библиотеки I2C для ATTiny85?
- Можно ли подключить экран SD-карты к плате Digispark ATtiny85?
- Почему DigiSpark не распознается автоматически на других компьютерах?
- Digispark ATtiny 85 - не распознается как HID устройство
- Компьютер не обнаруживает DigiSpark attiny85
- Изменить тактовую частоту Digispark, работать при низком напряжении
Я удалил все комментарии, дошедшие до санок. Помните, что комментарии под вопросом предназначены для его разъяснения, а не для нападок друг на друга., @Nick Gammon
Если вы хотите пожаловаться на работу этого сайта, поднимите проблему на [нашем мета-сайте](https://arduino.meta.stackexchange.com/)., @Nick Gammon
Мне вопрос кажется разумным, однако @Paperino, вам не следует повторять один и тот же вопрос. Постарайтесь сохранить оригинал, где это возможно. Поскольку сейчас он удален, я предлагаю воспользоваться этим., @Nick Gammon