Есть ли какой-нибудь код, который я могу использовать, чтобы узнать, на какой скорости работает выбранный последовательный порт?
Есть ли какой-нибудь код, который я могу использовать, чтобы узнать, на какой скорости работает выбранный последовательный порт?
Ответы:
Существует не верхний уровень, простой в использовании способ. Сожалею. Вероятно, проще просто сохранить выбранную скорость передачи в переменной при настройке последовательного порта.
В любом случае, то, что вы можете попытаться сделать для аппаратных 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 бод.