Keyboard.write записывает целочисленное значение ASCII в виде строки

У меня есть следующий код:

#include <SoftwareSerial.h>
#include <Keyboard.h>

SoftwareSerial ttySerial(10, 11); // прием, передача
void setup()
{
  // Открытие последовательной связи и ожидание открытия порта:
  Serial.begin(115200);
  while (!Serial) {
    ; // ждем подключения последовательного порта. Требуется только для родного USB
  }

  Serial.println("Serial Initialized");

  //Устанавливаем скорость передачи данных для порта SoftwareSerial
  ttySerial.begin(115200);
  ttySerial.println("tty Initialized");

  Keyboard.begin();
}

void loop() 
{
  while (ttySerial.available())
    //Серийный.запись();
    Keyboard.write(ttySerial.read());

// если (Серийный.доступный())
// ttySerial.write(Serial.read());
}

моя проблема в том, что ttySerial.read() является int, и я думал, что метод Keyboard.write может обрабатывать целочисленные аргументы: <code>Keyboard.write(32)</code> должен писать "< пробел >", а не "32". ".

Есть идеи, что происходит?

, 👍-1

Обсуждение

я не вижу Keyboard.write(32) в вашем коде ... что вы делаете, чтобы отправить байт 32 в скетч?, @jsotola

@jsotola это потому, что я пишу байт 32 на контакт RX, используя SoftwareSerial. ttySerial.read() - это место, где я восстанавливаю это и хочу, чтобы оно было записано с помощью Keyboard.write. Проще говоря ttySerial.read() == байт 32 (но также может принимать форму других байтов), @Sterling Butters

И в чем проблема? Эта программа ведет себя неправильно? Если да, то что он делает? Какое поведение вы ожидаете вместо этого?, @Edgar Bonet

он пишет 32, потому что вы отправляете «32». Отправьте 32 или ' ' для имитации нажатия пробела., @Juraj

@Juraj Как я могу преобразовать «32», полученное из string, в int? Я пытался использовать ttySerial.read().toInt()), но получаю ошибку компиляции, @Sterling Butters

@EdgarBonet Клавиатура записывает целочисленные значения ASCII вместо символа ASCII, соответствующего этому целому числу. Мое ожидание - это "запись" символа ASCII, @Sterling Butters

принимаются два отдельных символа. вы можете печатать отладочные сообщения в Serial Monitor при использовании HID, @Juraj

@Juraj Должен ли я тогда использовать ttySerial.readString()? Как я могу прочитать два отдельных символа в одно целое значение? Обратите внимание, что иногда целое число будет состоять из 1 цифры, иногда из 2, иногда из 3., @Sterling Butters

вы можете использовать parseInt. или отправлять байты, а не текст. что такое отправитель? отправить '' не "32", @Juraj

@Juraj Да, похоже, parseInt() - это то, что я ищу, спасибо! Я попробую сегодня вечером. К сожалению, библиотека последовательного порта js, которую я использую, позволяет передавать только буферы и строки, а не целые числа. Кроме того, обработка модификаторов может затрудниться, если не будет отправлено целочисленное значение ASCII. Похоже, что parseInt() будет читать char и автоматически преобразовывать тип данных в int, так что это должно быть идеально., @Sterling Butters

почему бы не отправить символы, которые вы хотите нажать, а не коды ascii?, @Juraj

@Juraj> «обработка модификаторов может затрудниться, если не будет отправлено целочисленное значение ASCII», @Sterling Butters

Вы можете отправлять произвольные данные с буфером JavaScript. Например, и Buffer.from([32]), и Buffer.from(' ') дадут вам буфер, содержащий один байт с числовым значением 32., @Edgar Bonet

@EdgarBonet по какой-то причине не работает, но я еще немного повозлюсь с этим, @Sterling Butters

@Juraj parseInt() работает, но невероятно медленно — есть ли альтернативы? Изменить: теперь это немного быстрее, не знаю, почему, @Sterling Butters

это не медленно. он ждет секунду для следующего символа, потому что он не знает, какой из них последний. вы можете использовать ttySerial.setTimeout(100); (в настройке), @Juraj


1 ответ


-1

write будет рассматривать int как число и предполагает, что вы хотите преобразовать его в ascii. Попробуйте преобразовать это в char:

Keyboard.write((char)ttySerial.read());

Класс печати обрабатывает переменные char так, как если бы они уже были кодами ascii.

,

Вы говорите, что я должен попробовать Keyboard.print(...)? Или .пишите как у вас?, @Sterling Butters

Я говорю, что в любом случае вы должны кормить его символом, если это код ascii. И да, я бы, наверное, использовал там печать., @Delta_G

Ну, я пробовал (char)... в какой-то момент, но поведение все еще не было записью, но я не делал этого, используя .print, не уверен, что это будет иметь значение - я должен попробовать выйдет на следующей неделе, но я дам вам знать, @Sterling Butters

Delta_G, прочтите комментарии, пожалуйста, @Juraj