Появление странного символа при нажатии кнопок на USB-клавиатуре, подключенной к Arduino GIGA R1.

usb

Я использую следующий код:

#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(...);. Есть ли у кого-нибудь идеи, как это решить?

, 👍1

Обсуждение

[SHIFT]+[A] выглядит так же, как [A]? как выглядит Serial.println(_key, HEX)?, @dandavis


1 ответ


Лучший ответ:

0

У меня нет 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 отчета.

,