Вопрос по Keyboard.h для Arduino

Arduino_Novichok
Offline
Зарегистрирован: 13.05.2018

Вопрос по Keyboard.h , а точнее его методу Keyboard.press(key) , я совсем где то запутался.

А точнее пока только учусь программированию.



Я отправляю в Ардуино строку:

  • 1KEY_RETURN

Должен нажаться:

  • Enter , а выходит что нажимается |

Хотя Servial.println(key) показывает что верные данные передаю:

  • KEY_RETURN

Что я тут натворил ? :D

#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[- 1] = str[i];

      }



      Keyboard.press(key);

      delay(1);

      Keyboard.release(key);

      Serial.println(key);

      break;



    case '2':

      // Пока ничего

      break;

  }



}

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Мне кажется удивительным, что это вообще работает.

Я бы для начала kolVStr распечатал.

Arduino_Novichok
Offline
Зарегистрирован: 13.05.2018

Как понять распечатал бы kolVStr ? В kolVStr записывается количество полученых байтов (символов)

Просто мой массив char key, как то не так распознаёт Keyboard.press(key) , т.е. не так как я думаю (хотел бы), 

Если я в лоб напишу прям в скетче Keyboard.press(KEY_RETURN); - то всё отработает как и должно.

А мне надо чтобы Keyboard.press(); получал ключ из вне.

Что я не так делаю ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Arduino_Novichok пишет:

Как понять распечатал бы kolVStr ? В kolVStr записывается количество полученых байтов (символов)

Так это и интересно. Судя по коду, контроллер не должен читать строку целиком. Вероятнее всего - один первый символ. Вот это и хотелось бы выяснить - сколько символов он реально читает.

Цитата:

Просто мой массив char key, как то не так распознаёт Keyboard.press(key) , т.е. не так как я думаю (хотел бы), 

Если я в лоб напишу прям в скетче Keyboard.press(KEY_RETURN); - то всё отработает как и должно.

Минуточку: Вы всерьез считаете, что KEY_RETURN - это строка?

Я не разу не видел библиотеку, которую Вы используете, поэтому как она устроена - понятия не имею. Поэтому сразу и не понял, в чем ошибка (точнее, ошибок несколько, и я начал не с основной).

Посмотрите, что выведет в порт Serial.println(KEY_RETURN);

Arduino_Novichok
Offline
Зарегистрирован: 13.05.2018

Вы извините если я туплю, просто совсем юный падаван 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 ? и такое вообще возможно ?

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если Serial.println выводит число, вероятно не char, а byte.

Ну, значит и Вам, если Вы хотите эмулировать нажатие на эту клавишу, надо отправлять число 176 (но, опять же, не строку "176"). 

Arduino_Novichok
Offline
Зарегистрирован: 13.05.2018

andriano пишет:

Ну, значит и Вам, если Вы хотите эмулировать нажатие на эту клавишу, надо отправлять число 176 (но, опять же, не строку "176").

Попробовал - работает.

Выглядит это так:

char key [] = {'1','7','6','\0'};
int key2 = atoi(key);

Keyboard.press(key2);
Serial.println(key2); // показывает 176

Осталось только понять как в моём примере это должно выглядеть.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Arduino_Novichok пишет:

Осталось только понять как в моём примере это должно выглядеть.

Ну, теоретически пример существенно упростится и, главное, будет работать надежнее, если применить Serial.parseInt.

Вопрос в другом: Приведенный Вами пример выглядит очень искусственным. Вероятно, Вы хотите решить какую-то другую задачу, а приведенный код преследует целью лишь немного освоиться с Ардуино. Но, если мое предположение верно, то, скорее всего, Вы выбрали на редкость неэффективный способ управления клавиатурой.

Arduino_Novichok
Offline
Зарегистрирован: 13.05.2018

Действительно, наверняка я выбрал неэффективнй способ.
Но используя char, я могу не писать kecode для каждого символа, а сразу написать "Текст текст текст"

А так же поместить в массив char что угодно и разбить как угодно.