Чи можете ви запитати поточну швидкість послідовного порту?


9

Чи є якийсь код, який я можу використати, щоб дізнатися, на якій швидкості вибраний послідовний порт?


1
Можливо, буде простіше визначити швидкість у змінній :)
Анонімний пінгвін

Ви маєте на увазі, що ПК або якийсь інший пристрій встановлює послідовну швидкість, а 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 і так далі. Неординарні дошки (і Serialна леонардо) будуть абсолютно іншими.

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

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


дякую, що це я шукав, але, як було сказано, це може бути більше проблем, ніж варто, порівняно з іншими альтернативами.
Hayden Thring
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.