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". ".
Есть идеи, что происходит?
@Sterling Butters, 👍-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
- Как получить тип данных переменной?
- Создание строк с символами UTF-8 из данных
- Не выводится на serial monitor, отправляя строку на serial.print
- String() против char для простого управления потоком
- Как анализировать многострочные последовательные данные с неизвестным количеством строк?
- Присвоение значения порядку байтов структуры
- Помогите с алгоритмом нажатия клавиш Arduino Micro.
- Могу ли я использовать PL2303 USB to TTL Последовательный конвертер Модуль отправки нажатия клавиш с помощью Arduino nano?
я не вижу
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