มีรหัสบางอย่างที่ฉันสามารถใช้เพื่อค้นหาความเร็วของพอร์ตอนุกรมที่เลือกไว้ที่ใด
มีรหัสบางอย่างที่ฉันสามารถใช้เพื่อค้นหาความเร็วของพอร์ตอนุกรมที่เลือกไว้ที่ใด
คำตอบ:
ไม่มีวิธีระดับสูงสุดใช้งานง่าย ขอโทษ มันอาจจะง่ายกว่าที่จะเก็บอัตราการรับส่งข้อมูลที่คุณเลือกไว้ในตัวแปรเมื่อคุณตั้งค่าพอร์ตอนุกรม
อย่างไรก็ตามสิ่งที่คุณสามารถลองทำเพื่อใช้กับฮาร์ดแวร์ UARTs ที่ใช้ AVR นั้นคือการยกเลิกSerial.begin
การตั้งค่าอัตราการรับส่งข้อมูลโดยเฉพาะ แต่ก็ค่อนข้างเจ็บปวด นี่คือรหัสสำหรับตั้งค่าอัตรารับส่งข้อมูล:
// 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;
คุณสามารถค้นหาผลลัพธ์ของสิ่งนี้ได้โดยการอ่านการลงทะเบียน UCSRA, UBRRH และ UBRRL ที่ถูกต้อง ใน uno เหล่านั้นคือชื่อการลงทะเบียนที่ถูกต้องบนเมกะ UCSR0A, UBRR0H, UBRR0L สำหรับ Serial, UCRS1A ... สำหรับ serial1 และอื่น ๆ บอร์ดที่ไม่ใช่ avr (และSerial
เลโอนาร์โด) จะแตกต่างกันโดยสิ้นเชิง
จะมีสถานะเดียวสำหรับการลงทะเบียนทั้งสามในพอร์ตอนุกรมฮาร์ดแวร์ AVR สำหรับบอร์ดเฉพาะ (และความถี่ของบอร์ดนั้น) ในแต่ละอัตรารับส่งข้อมูล คุณสามารถลองสร้างสมการเพื่อให้ได้อัตราการรับส่งข้อมูลดั้งเดิม แต่ฉันขอแนะนำให้เปรียบเทียบค่าโดยตรงกับการค้นหาบางชนิดเนื่องจากข้อผิดพลาดการปัดเศษจำนวนเต็มจะทำให้เกิดความยุ่งเหยิง
ตัวอย่างเช่นใน UBBR0H ขนาดใหญ่ของฉัน UBBR0L และ UCSR0A คือ 0, 207, 2 ที่ 9600 baud แต่พวกเขาคือ 0, 51, 2 ที่ 38400 baud และ 0, 16, 0 ที่ 57600 baud