Буфер чтения из программного обеспечения-Последовательный и запись в последовательный

Мой прогресс до сих пор:

#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()

, 👍-1

Обсуждение

вы не сказали, какие проблемы вы испытываете ... "последовательный монитор сходит с ума" и "поведение не то, что я ожидаю" - оба бессмысленны, @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


1 ответ


0

Не используйте 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