Bạn có thể truy vấn tốc độ của cổng nối tiếp hiện tại không?


9

Có một số mã tôi có thể sử dụng để tìm hiểu tốc độ của cổng nối tiếp được chọn đang chạy ở mức nào không?


1
Có thể dễ dàng hơn để xác định tốc độ trong một biến :)
Chim cánh cụt ẩn danh

Bạn có nghĩa là PC hoặc một số thiết bị khác đặt tốc độ nối tiếp và Arduino sẽ tự điều chỉnh để phù hợp?
DaveP

Câu trả lời:


7

Không có cấp cao nhất, cách sử dụng dễ dàng. Lấy làm tiếc. Có thể dễ dàng hơn khi chỉ lưu trữ tốc độ truyền đã chọn của bạn trong một biến khi bạn thiết lập cổng nối tiếp.

Dù sao, những gì bạn có thể cố gắng làm cho các UART phần cứng, dựa trên AVR là hoàn tác những gì Serial.beginđể thiết lập tốc độ truyền cụ thể, nhưng hơi khó khăn. Đây là mã để thiết lập tốc độ baud:

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

Bạn có thể tìm thấy kết quả của việc này bằng cách đọc đúng các thanh ghi UCSRA, UBRRH và UBRRL. Trên một uno đó là các tên đăng ký chính xác, trên một mega UCSR0A, UBRR0H, UBRR0L cho serial, UCRS1A ... cho serial1, v.v. Các bảng không avr (và Serialtrên một leonardo) sẽ hoàn toàn khác nhau.

Sẽ có một trạng thái duy nhất cho ba thanh ghi đó trên một cổng nối tiếp phần cứng AVR cho một bảng cụ thể (và tần số của bảng đó) ở mỗi tốc độ truyền. Bạn có thể thử và tạo một phương trình để có được tốc độ truyền ban đầu, nhưng tôi khuyên bạn chỉ nên so sánh các giá trị trực tiếp với một tra cứu nào đó bởi vì các lỗi làm tròn số học số nguyên sẽ khiến nó trở thành một mớ hỗn độn.

Ví dụ: trên mega UBBR0H, UBBR0L và UCSR0A của tôi là 0, 207, 2 ở 9600 baud, nhưng chúng là 0, 51, 2 ở 38400 baud và 0, 16, 0 ở 57600 baud.


cảm ơn đây là thứ tôi đang tìm kiếm, nhưng như đã nói nó có thể rắc rối hơn giá trị so với các lựa chọn thay thế khác.
Hayden Thring 3/03/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.