Puoi interrogare la velocità della porta seriale corrente?


9

Esiste un codice che posso usare per scoprire a che velocità sta funzionando la porta seriale scelta?


1
Potrebbe essere più semplice definire la velocità in una variabile :)
Anonimo Penguin

Vuoi dire che il PC o qualche altro dispositivo imposta la velocità seriale e che Arduino si adegua per adattarsi?
DaveP,

Risposte:


7

Non esiste un modo di livello superiore, facile da usare. Scusate. Probabilmente è più semplice memorizzare la velocità di trasmissione selezionata in una variabile quando si configura la porta seriale.

Ad ogni modo, ciò che puoi provare a fare per gli UART hardware basati su AVR è annullare cosa Serial.beginfa per impostare un baud rate particolare, ma è un po 'una seccatura. Questo è il codice per impostare la velocità di trasmissione:

  // 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;

Puoi trovare i risultati leggendo i giusti registri UCSRA, UBRRH e UBRRL. Su uno quelli sono i nomi di registro corretti, su un mega UCSR0A, UBRR0H, UBRR0L per seriale, UCRS1A ... per seriale1 e così via. Le schede non avr (e Serialsu un leonardo) saranno totalmente diverse.

Ci sarà un unico stato per quei tre registri su una porta seriale hardware AVR per una particolare scheda (e frequenza di quella scheda) ad ogni baud rate. Puoi provare a fare un'equazione per ottenere il baud rate originale, ma ti consiglio di confrontare i valori diretti con una ricerca di qualche tipo perché gli errori di arrotondamento aritmetico intero lo renderanno un casino enorme.

Ad esempio, sul mio mega UBBR0H, UBBR0L e UCSR0A sono 0, 207, 2 a 9600 baud, ma sono 0, 51, 2 a 38400 baud e 0, 16, 0 a 57600 baud.


grazie questo è il genere di cosa che stavo cercando, ma come detto potrebbe essere più un problema che un valore rispetto ad altre alternative.
Hayden Thring,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.