Буфер чтения из программного обеспечения-Последовательный и запись в последовательный
Мой прогресс до сих пор:
#include <SoftwareSerial.h>
SoftwareSerial ttySerial(10, 11); // RX, TX
byte buffer;
void setup()
{
// Откройте последовательную связь и дождитесь открытия порта:
Serial.begin(115200);
while (!Serial) {
; // дождитесь подключения последовательного порта. Требуется только для собственного USB
}
Serial.println("Serial Initialized");
//Установите скорость передачи данных для программного порта
ttySerial.begin(115200);
ttySerial.println("tty Initialized");
}
void loop()
{
ttySerial.listen();
while (ttySerial.available())
//byte buffer = ttySerial.read();
//Serial.write(buffer);
Serial.write(ttySerial.read());
// if (Serial.available())
// ttySerial.write(Serial.read());
}
Я действительно сбит с толку, потому что, если я запишу данные как буфер, который я определил, последовательный монитор сойдет с ума. Если я загружаю код, как показано, я не получаю ничего странного в мониторе, но поведение не то, что я ожидаю.
Я пишу в программный последовательный код на RX10 и TX11 (из javascript) следующие данные:
Буфер.([0, 0, 4, 0, 0, 0, 0, 0]
) (нажатие клавиши "а")
Метод Buffer.from
поступает из узла
с помощью модуля serialport
npm
. (Это в основном не имеет значения, так как отправка данных из Buffer.from('test')
работает и выводится на монитор.
Как вы можете видеть, буфер составляет 1 байт (массив, образующий 8 бит). Почему буфер не читается на мониторе как "а"? Это потому, что Микро имеет абстрактный скрытый дескриптор отчета (см. Ниже)?
Кроме того, что представляет собой Serial.write (...)
? Т. Е. Когда я закрываю последовательный монитор Arduino IDE, мой Arduino Micro автоматически возьмет на себя функцию HID и запишет данные как устройство HID? С
Я знаю, что уже есть библиотеки клавиатуры
и мыши
, но у меня уже есть код, который генерирует необработанные скрытые данные, которые я предпочел бы использовать. Обратите внимание, что буфер, описанный выше, происходит из дескриптора отчета HID для универсальной клавиатуры, т. Е. "4" - это не просто код ASCII для "a". Объяснил Здесь, Может быть, я могу использовать https://www.arduino.cc/en/Reference/HID ?
Заранее спасибо!
ИЗМЕНИТЬ 1: Это выход, который я вижу из кода, как показано (без монитора "сходит с ума")
19:51:03.017 -> Serial Initialized
19:51:13.932 -> //Где я надеялся увидеть "a"
EDIT 2: Я нашел дескриптор отчета в Keyboard.cpp
:
// Клавиатура
0x05, 0x01, // USAGE_PAGE (Generic Desktop) // 47
0x09, 0x06, // USAGE (Клавиатура)
0xa1, 0x01, // COLLECTION (Приложение)
0x85, 0x02, // REPORT_ID (2)
0x05, 0x07, // USAGE_PAGE (Клавиатура)
0x19, 0xe0, // USAGE_MINIMUM (Клавиатура LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Клавиатура Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x73, // LOGICAL_MAXIMUM (115)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Зарезервировано (событие не указано))
0x29, 0x73, // USAGE_MAXIMUM (приложение клавиатуры)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0xc0, // END_COLLECTION
Мне нужно будет сравнить это с данными, которые я буду отправлять в Keyboard.write()
@Sterling Butters, 👍-1
Обсуждение1 ответ
Не используйте listen() таким образом. Он очищает буфер приема. Вы теряете данные, полученные перед вызовом listen ().
У вас есть только один экземпляр SoftwareSerial, поэтому вам не нужно вызывать функцию listen(). Функция listen() очищает буфер приема, поскольку для всех экземпляров SoftwareSerial имеется только один буфер.
Это не решило мою проблему. Я опубликую свои результаты в редактировании, @Sterling Butters
Я думаю, что "Последовательный" не знает, как анализировать входной буфер. Я подумал, что это может сработать для метода Keyboard.write (<buffer>)
, так как дескриптор отчета в Keyboard.cpp " возможно, вы знаете, как анализировать входные данные буфера, но безрезультатно. Это было одной из причин вопроса "что представляет собой
Serial.write (...)?...`, @Sterling Butters
Возможно, "HID.SendReport(идентификатор uint8_t, const void* data, int len)` может сработать, но я не знаю, каким будет "идентификатор", "данные" или " len "именно в этом контексте... может быть, "идентификатор" - это буфер, а " len "- это "8", но какими будут "данные"?, @Sterling Butters
@SterlingButters, ваш код, о котором идет речь, не инициализируется и не использует HID, поэтому в игре нет HID и, конечно, не над программным обеспечением., @Juraj
но вы думаете, что если я инициализирую HID, этот буфер может сработать? Не могли бы вы также уточнить, что такое "идентификатор", "данные" и " лен` в этом случае?, @Sterling Butters
какой буфер?. Программное обеспечение и HID не имеют ничего общего друг с другом., @Juraj
Насколько я понимаю, я использую последовательное программное обеспечение для сбора буфера, который я передаю на вывод 10 (из js). Затем я хотел бы написать буфер, используя некоторую библиотеку эмуляции HID. Мой вопрос в том, будет ли это работать с буфером, который я определил выше, и как я буду указывать аргументы для " HID.SendReport (...)"?, @Sterling Butters
если вы хотите отправить клавиши клавиатуры, используйте библиотеку клавиатур. смотрите примеры библиотеки., @Juraj
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/105124/discussion-between-sterling-butters-and-juraj)., @Sterling Butters
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Чтение SMS с помощью Arduino Uno и SIM800L и печать на LCD (16x2 буквенно-цифровых) с использованием последовательного соединения
- Как работает последовательная связь на Arduino?
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
вы не сказали, какие проблемы вы испытываете ... "последовательный монитор сходит с ума" и "поведение не то, что я ожидаю" - оба бессмысленны, @jsotola
пожалуйста, обратитесь к этому https://www.arduino.cc/en/Tutorial/SoftwareSerialExample, @jsotola
@jsotola
serial monitor goes crazy
- монитор получает тонну выходных данных, которые поступают так быстро, что я на самом деле не вижу, что он говорит, и его непрерывная прокрутка не позволит мне сузить круг поиска. `поведение - это не то, что я ожидаю "- Если я включу метку времени, то смогу увидеть, что данные были получены, но это ничего не видно, не говоря уже о" а", на которое я надеялся, @Sterling Butters@jsotola Спасибо, но это тот пример, который я использовал, чтобы придумать то, что вы видите выше. В каком-то смысле программный сериал работает нормально - это то чтение/запись, с которым я борюсь, @Sterling Butters
используйте более низкую скорость передачи данных в бодах, и вы сможете увидеть, что пролетает мимо ... отключение автоматической прокрутки также может помочь ... в противном случае используйте внешний последовательный монитор, такой как *putty*, и включите захват файлов, @jsotola
@jsotola это *выглядит* так, как будто он просто говорит "Serial Initialized" кучу раз - да, могу подтвердить:
19:58:43.472 -> Serial Initialized 19:58:43.555 ->
- это непрерывный выход, @Sterling Butters