Появление странного символа при нажатии кнопок на USB-клавиатуре, подключенной к Arduino GIGA R1.
Я использую следующий код:
#include "USBHostGiga.h"
//REDIRECT_STDOUT_TO(Serial)
Keyboard keyb;
HostSerial ser;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
while (!Serial);
pinMode(PA_15, OUTPUT);
keyb.begin();
ser.begin();
}
void loop() {
if (keyb.available()) {
auto _key = keyb.read();
Serial.println(keyb.getAscii(_key));
}
while (ser.available()) {
auto _char = ser.read();
Serial.write(_char);
}
//delay(1);
}
отсюда: https://docs.arduino.cc/tutorials/giga-r1- Wi-Fi/гига-USB
Я использую Arduino GIGA R1, к которому подключил USB-клавиатуру и нажимаю кнопки. Результаты вижу в сериале. Однако столкнулся со следующей проблемой: когда я нажимаю кнопку, рядом с буквой появляется еще и квадрат. Например, предположим, я нажимаю букву «А». В сериале я получаю букву «А» + квадратный символ. Когда я нажимаю «B», я получаю «B» + квадратный символ и т. д. Я пытаюсь это исправить в течение 2 дней, я пытался прочитать кнопку как массив символов с двумя позициями и удалить [1], где квадрат должен быть, но ничего не получилось. Тип auto
очень странен для приведения типов, потому что Arduino IDE постоянно показывает мне ошибку. Я не могу найти способ удалить странный «квадратный» символ ASCII, который я получаю при каждом нажатии буквы... Единственное, что я заметил, это то, что квадратный символ ASCII отображается, когда я отпускаю кнопку клавиатуры, а также задерживается при нажатии. появляются, когда я увеличиваю задержку мс в команде delay(...);
. Есть ли у кого-нибудь идеи, как это решить?
@John, 👍1
Обсуждение1 ответ
Лучший ответ:
У меня нет GIGA R1, поэтому нет практического способа проверить это. Я также не могу объяснить, почему у вас он отображается квадратным. Это обычное поведение для кодов символов, которые не имеют глифа шрифта для отображения таким образом, но рассматриваемый код (нулевой символ) не делает этого для меня в IDE 1.x 2.x.
Однако остальная часть нижеизложенного может помочь.
Согласно github,
тип, возвращаемый .read()
, — это HID_KEYBD_Info_TypeDef
, поэтому, если вы хотите, вы сможете:
const HID_KEYBD_Info_TypeDef _key = keyb.read();
Однако нет ничего плохого в использовании здесь auto
. Насколько я могу судить, что вы действительно получаете
— это содержимое отчетов HID режима загрузки.
На самом деле это не индивидуальная информация о клавишах, а скорее состояние, которое может включать до 6 нажатых клавиш.
Если вы нажимаете только одну клавишу (одну клавишу состояния без Shift; например, не «shift», «control», «alt» и т. д.,
он отображается в массиве с индексом 0, что соответствует getAscii
является в конечном итоге интерпретацией.
Поэтому, когда вы отпускаете клавишу (все из них), вы получаете отчет ни с чем (без кода ключа; представлено нулевым значением) в keys[0]
, и поэтому там ничего нет из которого можно получить код ASCII.
Похоже, что он переводит имеющееся там значение 0 в еще один ноль .
Итак, кажется, все, что вам нужно сделать, это проверить, является ли он нулем после вызова getAscii
, например:
if (keyb.available()) {
const auto keyboard_input_report /*not really a key*/ = keyb.read();
const auto first_as_ascii = keyb.getAscii(keyboard_input_report);
// где getAscii на самом деле означает getAsciiCodeOfFirstkeyIf ThereIsOneInTheReport
if (first_as_ascii != 0) {
Serial.println(first_as_ascii);
}
}
Вы можете проверить перед переводом с помощью if (keyboard_input_report.keys[0] != 0) {
. Однако первое может иметь больше смысла. Потому что не каждая клавиша на клавиатуре в любом случае будет соответствовать значению кода ASCII. Например, ASCII не представляет клавиши со стрелками, функциональные клавиши или страницу вверх/вниз.
В любом случае в этом коде могут возникнуть проблемы при нажатии нескольких клавиш. Похоже, что для правильного выполнения этого действия потребуется использование внутренних компонентов getAscii
, чтобы просмотреть таблицы перевода для всех шести записей в массиве keys
отчета.
- Первая настройка - отказ в доступе к usb-порту - ubuntu 14.04
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Может ли Arduino взаимодействовать с USB-устройствами без USB-хост-экрана?
- Если USB дает 5 В, как Arduino может подавать 5 В на контакт 5 В? (И еще вопрос)
- Максимальная последовательная скорость CH340
- Можно ли использовать внешний источник питания и USB одновременно на Arduino?
- Эмуляция стандартного периферийного USB-устройства Mifare с помощью RFID-RC522
- Можно ли загрузить скетч Arduino через последовательный порт (RX) вместо USB?
[SHIFT]+[A] выглядит так же, как [A]? как выглядит
Serial.println(_key, HEX)
?, @dandavis