Вопрос по массиву Char и преобразованию

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

Как я могу использовать KEY_RETURN в Keyboard.press(); ?
Если KEY_RETURN будет находиться в массиве char:
char key [] = {'K','E','Y','_','R','E','T','U','R','N','\0'};

https://www.arduino.cc/en/Reference/KeyboardPress

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А как Вы его хотите использовать? Чего хотите добиться?

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

Arduino_Novichok пишет:

Как я могу использовать KEY_RETURN в Keyboard.press(); ?
Если KEY_RETURN будет находиться в массиве char:
char key [] = {'K','E','Y','_','R','E','T','U','R','N','\0'};

https://www.arduino.cc/en/Reference/KeyboardPress

Arduino_Novichok, KEY_RETURN и "KEY_RETURN" - совершенно разные константы.

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

Цитата:

Arduino_Novichok, KEY_RETURN и "KEY_RETURN" - совершенно разные константы.

Возможно ли преобразовать "KEY_RETURN" в KEY_RETURN ?

чтобы запихнуть в Keyboard.press(KEY_RETURN);

или только так для каждой клавиши:

if (key == "KEY_RETURN") {Keyboard.press(KEY_RETURN);}

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arduino_Novichok пишет:

Возможно ли преобразовать "KEY_RETURN" в KEY_RETURN ?

чтобы запихнуть в Keyboard.press(KEY_RETURN);

Нет.

Arduino_Novichok пишет:

или только так для каждой клавиши:

if (key == "KEY_RETURN") {Keyboard.press(KEY_RETURN);}

Боюсь, что и так тоже нельзя. Хотя, это зависит от типа данных key.

Вы же скрипт не показываете - шифруетесь. Так что помочь Вам крайне затруднительно.

 

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

Не шифруюсь - вот всё
Я передаю из C# на Leonardo "1KEY_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;
  }

}

 

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

KEY_RETURN существует в тексте программы только до компиляции. В откомпилированном коде никакой KEY_RETURN нет. Соответственно, объяснить контроллеру что "KEY_RETURN" надо ставить в соответствие KEY_RETURN, а точнее число 176 (или какое там у Вас получилось) можно либо приведенным Вами способом либо более или менее аналогичным. Ну т.е. можни применять таблицы, массивы и т.д., но суть останется прежней: строке "KEY_RETURN" нужно поставить в соответствие число 176.

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

andriano
Спасибо Вам ! Теперь всё стало понятно, я же думал что я могу превратить "KEY_RETURN" в KEY_RETURN
Буду думать над иными способами с конвертацией {'1','7','6'} в int или кучу условий вешать xD

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arduino_Novichok пишет:

Не шифруюсь - вот всё

      char key[128];

Если так, то так как Вы писали

Arduino_Novichok пишет:

или только так для каждой клавиши:

if (key == "KEY_RETURN") {Keyboard.press(KEY_RETURN);}

не получится. Строки так не сравниваются.

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

Все-таки, мне кажется, Вы пытаетесь применить какой-то очень неоптимальный алгоритм.

Вы увероены, что в качестве промежуточного формата целесообразно использовать текстовую строку?

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

andriano пишет:

Вы увероены, что в качестве промежуточного формата целесообразно использовать текстовую строку?

Я не могу знать) - я только учучь и осваиваю, да ещё и не с того конца начал.
Но пока выбрал сhar из за того что могу его использовать и как string и при необходимости преобразовывать в int.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Смотришь, какое значение имеет константа KEY_RETURN в исходниках Keyboard.h. На стороне C# создаёшь enum с нужными значениями, например:

public enum KeyCode
{
KEY_RETURN = 123,
....
}

Передаёшь в ардуину по Serial либо строку, которую разбираешь на приёмной стороне, либо - набор байт, обозвав его пакетом. Скажем, в пакете всегда два байта: первый байт - идентификатор команды, второй байт - дополнительные данные. Условимся, что байт со значением 1 - у нас означает команду "нажать клавишу". На стороне C# в порт пишешь:

serial.Write(1);
serial.write(Convert.ToByte(KeyCode.KEY_RETURN));

На стороне ардуины принимаешь:

if(Serial.available() > 1)
{
  byte command = Serial.read();
  byte param = Serial.read();
  switch(command)
  {
    case 1:
    {
         Keyboard.press(param);
    }
    break;
  }
}

Профит, никаких строковых констант.

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

Wow - спасибо. Буду переваривать.
Не знал что могу считать сначало команду , а затем параметр, думал нужно всё одной строкой посылать.
И эту строку уже разбирать.

А как быть , если мне нужно отправить целое предложение.
Keyboard.write("Очень большое предложение !");

Со строкой всё очень просто, а как с байтами ?

 

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

DIYMan, сдается мне, что KEY_RETURN уже определена где-то в недрах Keyboard.h и дополнительно определять ее не нужно.

Arduino_Novichok, информация в Serial передается последовательно по одному байту. Обычно, наоборот, у новичков возникают вопросы, как передать многобайтовыю переменную.

В любом случае, мы можем передавать по одному байту и читать по одному байту; передавать несколько байт, а читать по одному; передавать по одному, а читать - несколько и т.д. Т.е. между устройствами идет просто поток байтов, а как мы ими распорядимся - наше дело.