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

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

8 голосов | спросил Hayden Thring 2 MaramMon, 02 Mar 2015 03:23:24 +03002015-03-02T03:23:24+03:0003 2015, 03:23:24

1 ответ


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 и так далее. Платы без рекламы (и Serial на leonardo) будут совершенно разными.

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

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

ответил BrettAM 2 MaramMon, 02 Mar 2015 04:00:52 +03002015-03-02T04:00:52+03:0004 2015, 04:00:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132