Вопрос по Keyboard.h для Arduino
- Войдите на сайт для отправки комментариев
Вопрос по Keyboard.h , а точнее его методу Keyboard.press(key) , я совсем где то запутался.
А точнее пока только учусь программированию.
Я отправляю в Ардуино строку:
- 1KEY_RETURN
Должен нажаться:
- Enter , а выходит что нажимается |
Хотя Servial.println(key) показывает что верные данные передаю:
- KEY_RETURN
Что я тут натворил ?
#include "Keyboard.h"
char str[128]; // строка с данными
int kolVStr; // Количество символов в строке
void setup() {
Serial.begin(9600);
Keyboard.begin();
}
void loop() {
kolVStr = 0;
memset(str, '\0', 128);
if (Serial.available() > 0) { // Если пришли данные
kolVStr = Serial.available();
for (int i = 0; i < kolVStr; i++) { // Записываю символы в массив
str[i] = Serial.read();
}
}
switch (str[0]) {
case '1':
char key[128];
memset(key, '\0', 128);
for (int i = 1 ; i < kolVStr; i++) { // Переписываю массив без первого символа
key[i - 1] = str[i];
}
Keyboard.press(key);
delay(1);
Keyboard.release(key);
Serial.println(key);
break;
case '2':
// Пока ничего
break;
}
}
Мне кажется удивительным, что это вообще работает.
Я бы для начала kolVStr распечатал.
Как понять распечатал бы kolVStr ? В kolVStr записывается количество полученых байтов (символов)
Просто мой массив char key, как то не так распознаёт Keyboard.press(key) , т.е. не так как я думаю (хотел бы),
Если я в лоб напишу прям в скетче Keyboard.press(KEY_RETURN); - то всё отработает как и должно.
А мне надо чтобы Keyboard.press(); получал ключ из вне.
Что я не так делаю ?
Как понять распечатал бы kolVStr ? В kolVStr записывается количество полученых байтов (символов)
Так это и интересно. Судя по коду, контроллер не должен читать строку целиком. Вероятнее всего - один первый символ. Вот это и хотелось бы выяснить - сколько символов он реально читает.
Просто мой массив char key, как то не так распознаёт Keyboard.press(key) , т.е. не так как я думаю (хотел бы),
Если я в лоб напишу прям в скетче Keyboard.press(KEY_RETURN); - то всё отработает как и должно.
Минуточку: Вы всерьез считаете, что KEY_RETURN - это строка?
Я не разу не видел библиотеку, которую Вы используете, поэтому как она устроена - понятия не имею. Поэтому сразу и не понял, в чем ошибка (точнее, ошибок несколько, и я начал не с основной).
Посмотрите, что выведет в порт Serial.println(KEY_RETURN);
Вы извините если я туплю, просто совсем юный падаван xD и не с того конца начал всем этим заниматься.
1. В переременную int kolVStr записывается число 5, если отправляют слово "Текст"
2. KEY_RETURN судя по всему это char
https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardpress/
3. Serial.println(KEY_RETURN); выводит: 176
Как я могу свою строку превратить в char ? и такое вообще возможно ?
Если Serial.println выводит число, вероятно не char, а byte.
Ну, значит и Вам, если Вы хотите эмулировать нажатие на эту клавишу, надо отправлять число 176 (но, опять же, не строку "176").
Ну, значит и Вам, если Вы хотите эмулировать нажатие на эту клавишу, надо отправлять число 176 (но, опять же, не строку "176").
Попробовал - работает.
Выглядит это так:
char key [] = {'1','7','6','\0'};
int key2 = atoi(key);
Keyboard.press(key2);
Serial.println(key2); // показывает 176
Осталось только понять как в моём примере это должно выглядеть.
Осталось только понять как в моём примере это должно выглядеть.
Ну, теоретически пример существенно упростится и, главное, будет работать надежнее, если применить Serial.parseInt.
Вопрос в другом: Приведенный Вами пример выглядит очень искусственным. Вероятно, Вы хотите решить какую-то другую задачу, а приведенный код преследует целью лишь немного освоиться с Ардуино. Но, если мое предположение верно, то, скорее всего, Вы выбрали на редкость неэффективный способ управления клавиатурой.
Действительно, наверняка я выбрал неэффективнй способ.
Но используя char, я могу не писать kecode для каждого символа, а сразу написать "Текст текст текст"
А так же поместить в массив char что угодно и разбить как угодно.