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?
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?
Câu trả lời:
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à Serial
trê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.