Apakah ada beberapa kode yang dapat saya gunakan untuk mengetahui kecepatan port serial yang dipilih?
Apakah ada beberapa kode yang dapat saya gunakan untuk mengetahui kecepatan port serial yang dipilih?
Jawaban:
Tidak ada cara tingkat atas, mudah digunakan. Maaf. Mungkin lebih mudah untuk hanya menyimpan baud rate yang Anda pilih dalam variabel ketika Anda mengatur port serial.
Pokoknya, Apa yang dapat Anda coba lakukan untuk UART perangkat keras berbasis AVR adalah membatalkan apa yang harus Serial.begin
dilakukan untuk mengatur kecepatan baud tertentu, tetapi sedikit merepotkan. Ini adalah kode untuk mengatur baud rate:
// 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;
Anda dapat menemukan hasil ini dengan membaca register UCSRA, UBRRH, dan UBRRL yang tepat. Pada uno itu adalah nama register yang benar, pada mega UCSR0A-nya, UBRR0H, UBRR0L untuk Serial, UCRS1A ... untuk serial1 dan seterusnya. Papan non-avr (dan Serial
leonardo) akan sangat berbeda.
Akan ada satu negara untuk tiga register pada port serial perangkat keras AVR untuk papan tertentu (dan frekuensi papan itu) pada setiap baud rate. Anda dapat mencoba dan membuat persamaan untuk mengeluarkan baud rate asli, tapi saya sarankan hanya membandingkan nilai langsung dengan semacam pencarian karena kesalahan pembulatan aritmatika integer akan membuatnya berantakan besar.
Sebagai contoh, pada mega UBBR0H, UBBR0L, dan UCSR0A saya adalah 0, 207, 2 pada 9600 baud, tetapi mereka adalah 0, 51, 2 pada 38400 baud dan 0, 16, 0 pada 57600 baud.