현재 직렬 포트의 속도를 쿼리 할 수 ​​있습니까?


9

선택한 직렬 포트의 속도가 얼마인지 확인하는 데 사용할 수있는 코드가 있습니까?


1
변수에서 속도를 정의하는 것이 더 쉬울 수도 있습니다 :)
Anonymous Penguin

PC 또는 다른 장치가 직렬 속도를 설정하고 Arduino가 자체적으로 조정하도록 설정 했습니까?
DaveP

답변:


7

사용하기 쉬운 최상위 레벨이 없습니다. 죄송합니다. 직렬 포트를 설정할 때 선택한 전송 속도를 변수에 저장하는 것이 더 쉽습니다.

어쨌든, 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입니다.


덕분에 이것은 내가 찾던 일종의 것이지만 다른 대안과 비교할 때 가치가있는 것보다 더 문제가 될 수 있다고 말했습니다.
Hayden Thring
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.