Bisakah Anda menanyakan kecepatan port serial saat ini?


9

Apakah ada beberapa kode yang dapat saya gunakan untuk mengetahui kecepatan port serial yang dipilih?


1
Mungkin lebih mudah untuk menentukan kecepatan dalam sebuah variabel :)
Anonymous Penguin

Apakah maksud Anda PC atau perangkat lain mengatur kecepatan serial, dan Arduino menyesuaikan diri agar sesuai?
DaveP

Jawaban:


7

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.begindilakukan 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 Serialleonardo) 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.


terima kasih ini adalah jenis hal yang saya cari, tetapi seperti yang dikatakan mungkin lebih banyak masalah daripada layak dibandingkan dengan alternatif lain.
Hayden Thring
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.