Чи є якийсь код, який я можу використати, щоб дізнатися, на якій швидкості вибраний послідовний порт?
Чи є якийсь код, який я можу використати, щоб дізнатися, на якій швидкості вибраний послідовний порт?
Відповіді:
Немає верхнього рівня, простий у користуванні спосіб. Вибачте. Напевно, простіше просто зберігати вибрану швидкість передачі даних у змінну під час налаштування послідовного порту.
У будь-якому випадку, те, що ви можете спробувати зробити для апаратних 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 бод.