답변:
사용하기 쉬운 최상위 레벨이 없습니다. 죄송합니다. 직렬 포트를 설정할 때 선택한 전송 속도를 변수에 저장하는 것이 더 쉽습니다.
어쨌든, AVR 기반의 하드웨어 UART를 위해 시도 할 수있는 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, Serial의 경우 UBRR0L, serial1의 경우 UCRS1A ...입니다. 비 avr 보드 (및 Serial
레오나르도)는 완전히 다릅니다.
각 보드 레이트에서 특정 보드 (및 해당 보드의 주파수)에 대한 AVR 하드웨어 직렬 포트에있는 3 개의 레지스터에 대한 단일 상태가 있습니다. 원래의 전송 속도를 얻기 위해 방정식을 만들려고 시도 할 수 있지만 정수 산술 반올림 오류로 인해 직접 값을 일종의 조회와 비교하는 것이 좋습니다.
예를 들어, 나의 메가 UBBR0H, UBBR0L 및 UCSR0A는 9600 보드에서 0, 207, 2이지만 38400 보드에서 0, 51, 2이고 57600 보드에서 0, 16, 0입니다.