Serial.begin () : 왜 항상 28800을 사용하지 않습니까?

많은 온라인 샘플 코드에서 설정 블록에 Serial.begin(9600) 줄을 추가합니다.

공식 문서에서 Serial.begin()가 무엇인지 찾아 보면 초당 비트 데이터 전송을 제어한다고 나와 있습니다.

그래서 당연한 질문입니다. 가장 높은 전송률 인 28800을 사용하지 않는 이유는 무엇입니까? 사람들이 9600에 만족하는 이유는 무엇입니까? 여기에 제한은 무엇입니까?

댓글

  • 참고로 USB 지원에 연결된 arduino의 최고 값은 실제로 115200이고, 57600이 두 번째로 가장 일반적인 경우가 많습니다. 보시죠.

답변

사람들이하는 이유 정착 하시겠습니까?

사람들은 충분히 빠르기 때문에 정착합니다. 가장 일반적인 용도는 디버깅을 위해 터미널에 일부 항목을 인쇄하는 것입니다. 9600 보드는 초당 960 자 또는 초당 12 x 80 자 라인입니다. 얼마나 빨리 읽을 수 있습니까? 🙂

프로그램에서 대량 데이터 전송에 직렬 포트를 사용하는 경우 해결하지 않기로 선택합니다.

무엇입니까? 제한 …

시리얼 제한이 높습니다. 직접 프로그램에서 115200 보드를 사용할 수 있으며 작동합니다. Arduino 터미널은 최대 115200을 허용하지만 RealTerm과 같은 다른 프로그램을 사용하면 더 높게 실행할 수 있습니다.

하드웨어 시리얼은 1M 보드로 실행됩니다. 주변을 읽으면 사람들이 UART를 직접 제어하여 최대 1M까지 사용한 것을 볼 수 있습니다. 블루투스 칩을 통한 전송과 같은 용도로 높은 전송 속도의 이점을 얻을 수 있습니다. 하드웨어 직렬 인터페이스를 사용하여 짧은 거리에서 칩에서 칩으로 교환하는 경우 1M 보드가 완전히 가능합니다. 1MHz 클럭 속도에서 잘 작동하는 모든 SPI 및 I2C 장치를 생각해보십시오.

거리가 멀면 로직 레벨 (일반 0 ~ 5V) 신호를 사용할 때 노이즈 문제가 발생하기 시작합니다. 더 먼 거리를 사용하려면 일반적으로 RS-232 및 덜 일반적으로 RS-485와 같은 강력한 신호를 제공하는 트랜시버를 추가해야합니다. RS-232를 사용하면 10 “s 피트의 거리에서 메가 비트를 실행할 수 있습니다.

마이크로 프로세서 클럭 속도가 실제 한계입니다. 하드웨어 UART를 사용하면 프로세서가 UART에 1 바이트를로드해야합니다. 10 비트마다 (N81의 경우). 따라서 1M 보오에 도달하면 16MHz 프로세서가 UART에 데이터를 제공하는 것이 어려울 것입니다. 160 클럭 틱마다 새 바이트가 전송되며 이는 매우 적은 라인입니다. 짧은 데이터 버스트의 경우 해당 속도에 도달 할 수 있습니다. 메시지는 UART가 제한에 도달하기 전에 프로세서 속도가 부족하다는 것입니다.

참고,이 모든 것이

HardwareSerial , 소프트웨어 시리얼은 매우 다릅니다.

댓글

  • 2M은 hw 직렬로 보관할 수 있지만 arduino '의 구현이 너무 느리고 많은 쓰레기를 보냅니다. 속도를 두 배로 늘리려면 atmega328p ds를 참조하세요. 또한 9800 보드는 매우 오래된 표준이며 의 센서는 xbee, gps 등과 같이 더 많이 구성 할 수 있더라도이 값을 표준으로 사용합니다. 또한 USB를 통한 직렬 자동 전송 속도 협상 마녀는 선택한 전송 속도를 무시할 수 있지만 arduino에서는 사용되지 않는다고 생각합니다 (하지만 레오나르도에있을 수 있음)
  • 9600 8N1도 사실상 기본 설정입니다. 직렬 인터페이스가있는 많은 장치가이 설정으로 제공되며 다른 속도 (또는 데이터 비트, 패리티 비트, 정지 비트)가 필요한 경우 구성해야합니다.
  • " 충분히 빠릅니다. "-좋은 대답이지만이 점에 다소 동의하지 않습니다. 대부분의 디버그 출력 구현은 차단되므로 코드 실행 시간의 과도한 변경을 방지하기 위해 디버그 출력을 최대한 빠르게 만드는 것이 매우 바람직합니다.
  • ' 대량 데이터 전송을 수행하고 있습니다. 이상적으로는 SPI를 사용하는 것이 ' 맞습니까?

답변

모든 흥미로운 답변 외에도 직렬 속도를 XXX 비트 / 초로 설정하는 것은 XXX 비트를 의미하지 않는다는 점을 언급 할 가치가 있습니다. / s.

시계 (쿼츠 기반이라 할지라도)는 불완전하며 드리프트 될 수 있습니다. 또한 직렬 클록은 일반적으로 2의 제곱 전제 수 및 (정수) 카운터를 통해 생성되므로 기본 클록 주파수가 주어지면 모든 값을 정확하게 얻을 수 없습니다. 시작 / 중지 비트의 도움으로 비동기 직렬 통신은 일부 클록 드리프트에 내성이있을 수 있습니다. 그러나 여기에는 한계가 있습니다.

예를 들어 ATmega328PA가 1MHz에서 실행중인 경우 0.2 %의 오류에서 9600b / s를 달성 할 수 있습니다. 그러나 14400b / s에서 오류는 -3.5 %입니다 (실제로는 13900b / s로 통신). 28800b / s에서 오류는 + 8.5 %입니다 (실제로는 31200b / s로 통신).모든 수치는 ATmega48PA-88PA-168PA-328PA 데이터 시트, p200 에서 가져온 것입니다.

이것은 두 개의 동일한 장치가 함께 통신 할 때 발생하는 문제가 아닙니다 (사실 동일한 속도로 통신하기 때문입니다). 다른 기기간에 통신 할 때 문제가 될 수 있습니다 .

기본 주파수를 높여도 정확도가 크게 향상되는 것은 아닙니다. 예를 들어, 2MHz에서 위와 동일한 ATmega328PA를 실행하는 것은 대부분 반올림 오류로 인해 더 나은 결과를 제공하지 않습니다. 하지만 1.8432MHz를 실행하면 2400b / s에서 최대 57.6kHz까지 매우 정확한 bps를 제공합니다.

Answer

가장 느린 전송 속도 (300)는 아니지만 결국 일부 설정 (28800 또는 115200)에서 문제를 일으킬 수있는 전송 속도를 사용하지 않는 전통입니다. PC 직렬 포트 (대부분 FTDI232 USB 어댑터)는 더 높은 속도를 처리 할 수 있지만 DIY 하드웨어는 그렇지 않을 수 있습니다. 따라서 9600bps는 코드 예제에 대한 일종의 표준 전송 속도로 자리 잡았습니다.

답변

시간의 안개로 거슬러 올라갑니다. , 원격 키보드 (전화 모뎀 및 텔레타이프 사용)의 “골드 표준”은 9600 보드였으며 처음에는 전용 전화선을 통해서만 달성 할 수있었습니다. 시간은 천천히 흘러갑니다. 기술은 빠르게 발전합니다. 그리고 기억은 시간보다 훨씬 느리게 움직입니다. 우리는 일상적으로 9600 보드보다 몇 배 빠른 속도로 최소한 몇 미터 이상 통신 할 수 있습니다. 한때 금색 표준으로 간주되었던 것은 더 이상 금이 아니지만 여전히 표준으로 간주됩니다.

tl; dr : 기술이 아니라 역사입니다.

답변

사람들이 9600을 대부분 사용하는 주된 이유는 그것이 Arduino IDE의 기본 전송 속도이기 때문이라고 생각합니다. 또한 직렬 신호가 먼 거리를 이동해야하는 경우에도 더 빠른 데이터 속도는 신뢰할 수 없습니다. 이것이 최적의 속도로 선택된 이유는 모르겠지만

답변

인간 반응 시간

Arduino가 포트에서 스 래싱 중일 때 직렬 모니터를 중지 할 수 있기 때문에 는 사용자에게 100 % 필요하며 최대 전송 속도는 100 %.

9600 baud는 “폭주 프로세스를 죽이기 쉬움”과 “놀라 울 정도로 느림”사이의 절충안입니다.

댓글

  • 100 % 헤이 … 흥미로운;)

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다