Можете ли вы запросить скорость текущего последовательного порта?

9

Есть ли какой-нибудь код, который я могу использовать, чтобы узнать, на какой скорости работает выбранный последовательный порт?

Хайден Тринг
источник
1
Возможно, будет проще определить скорость в переменной :)
Anonymous Penguin
Вы имеете в виду, что ПК или какое-либо другое устройство устанавливает последовательную скорость, а Arduino подстраивается под себя?
DaveP

Ответы:

7

Существует не верхний уровень, простой в использовании способ. Сожалею. Вероятно, проще просто сохранить выбранную скорость передачи в переменной при настройке последовательного порта.

В любом случае, то, что вы можете попытаться сделать для аппаратных UART на основе AVR, - это отмена того, что Serial.beginнужно для установки определенной скорости передачи, но это немного болезненно. Это код для установки скорости передачи:

  // Try u2x mode first
  uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2;
  *_ucsra = 1 << U2X0;

  // hardcoded exception for 57600 for compatibility with the bootloader
  // shipped with the Duemilanove and previous boards and the firmware
  // on the 8U2 on the Uno and Mega 2560. Also, The baud_setting cannot
  // be > 4095, so switch back to non-u2x mode if the baud rate is too
  // low.
  if (((F_CPU == 16000000UL) && (baud == 57600)) || (baud_setting >4095))
  {
    *_ucsra = 0;
    baud_setting = (F_CPU / 8 / baud - 1) / 2;
  }

  // assign the baud_setting, a.k.a. ubrr (USART Baud Rate Register)
  *_ubrrh = baud_setting >> 8;
  *_ubrrl = baud_setting;

Вы можете найти результаты этого, прочитав правильные регистры UCSRA, UBRRH и UBRRL. На uno это правильные имена регистров, на мега - UCSR0A, UBRR0H, UBRR0L для Serial, UCRS1A ... для serial1 и так далее. Не-AVR доски (и Serialна Леонардо) будет совершенно другой.

Для этих трех регистров на аппаратном последовательном порту AVR будет определенное состояние для конкретной платы (и частоты этой платы) на каждой скорости передачи данных. Вы можете попытаться составить уравнение, чтобы получить исходную скорость передачи, но я рекомендую просто сравнивать прямые значения с поиском некоторого вида, потому что целочисленные ошибки арифметического округления сделают это большим беспорядком.

Например, на моем мега UBBR0H, UBBR0L и UCSR0A равны 0, 207, 2 при 9600 бод, но они равны 0, 51, 2 при 38400 бод и 0, 16, 0 при 57600 бод.

BrettAM
источник
спасибо, это то, что я искал, но, как уже говорилось, это может быть больше проблем, чем стоит по сравнению с другими альтернативами.
Хайден Тринг