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


34

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

Serial.begin()공식 문서에서 무엇을 찾을 때 초당 비트 데이터 전송을 제어한다고 말합니다.

그렇다면 가장 큰 문제는 가장 높은 전송 속도 인 28800을 사용하지 않는 이유입니다. 사람들은 왜 9600에 정착합니까? 여기서 제한은 무엇입니까?


3
참고로 USB 지원에 연결된 아두 이노 중 가장 높은 것은 실제로 115200이며, 57600은 종종 두 번째로 많이 사용되는 보드입니다.
BrettAM

답변:


48

사람들은 왜 정착합니까?

사람들은 그것이 충분히 빠르기 때문에 정착합니다. 가장 일반적인 용도는 단지 디버깅을 위해 터미널에 일부 내용을 인쇄하는 것입니다. 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 피트 거리에서 메가 비트를 실행할 수 있습니다.

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

이 모든 것은 HardwareSerial에 적용되며 소프트웨어 직렬은 매우 다릅니다.


2M은 hw serial로 보관할 수 있지만 arduino의 구현은 너무 느려 쓰레기를 많이 보냅니다. 속도를 두 배로 늘리는 매직 비트를 찾으려면 atmega328p ds를 참조하십시오. 또한 9800 보드는 매우 오래된 표준이며 xbee, gps 등과 같이 더 많은 구성이 가능하더라도 많은 센서가이 값을 표준으로 사용합니다. 또한 USB를 통한 직렬 전송 자동 Baudrate 협상 마녀가 선택한 Baudate를 무시할 수 있지만 arduino에서 사용되지 않는다고 생각합니다 (그러나 leonardo에있을 수 있음)
Lesto

1
9600 8N1도 사실상 기본 설정입니다. 직렬 인터페이스가있는 많은 장치가이 설정으로 제공되며 다른 속도 (또는 데이터 비트, 패리티 비트, 정지 비트)가 필요한 경우 구성해야합니다.
피터 Mortensen

"충분히 빠르다"-좋은 대답이지만이 점에 다소 동의하지 않습니다. 대부분의 디버그 출력 구현은 차단되므로 코드 실행 시간의 과도한 변경을 방지하기 위해 디버그 출력을 최대한 빨리 만드는 것이 매우 바람직합니다.
Rev1.0

대량 데이터 전송을 수행하는 경우 SPI를 사용하는 것이 가장 좋습니다.
tuskiomi

6

모든 흥미로운 답변 외에도 직렬 속도를 XXX 비트 / s 로 설정 한다고 해서 하드웨어에서 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를 제공합니다.


3

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


2

과거에는 원격 키보드 (전화 모뎀 및 텔레타이프를 기억하는 경우)를 사용하는 "골드 표준"이 9600 보드였으며 처음에는 전용 전화 회선을 통해서만 가능했습니다. 시간은 천천히 움직입니다. 기술이 빠르게 발전합니다. 메모리는 시간보다 훨씬 느리게 움직입니다. 우리는 적어도 몇 미터 이상, 9600 보드보다 몇 배 빠른 속도로 일상적으로 통신 할 수 있습니다. 한때 금 본위제로 여겨 졌던 것은 더 이상 금이 아니라 여전히 표준으로 여겨집니다.

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


0

사람들이 9600을 가장 많이 사용하는 주된 이유는 Arduino IDE의 기본 전송 속도이기 때문입니다. 또한 직렬 신호가 먼 길을 이동 해야하는 경우 더 빠른 데이터 속도를 신뢰할 수 없습니다. 왜 이것이 최적의 속도로 선택되었는지는 모르겠습니다.


-2

인간 반응 시간

때문에 당신의 아두 이노 포트에 탈곡 된 시리얼 모니터를 중지 할 수있는 것은 사용자가 시간의 100 % 필요하며, 최대 전송 속도가 요구되는 데 보다 100 %의 시간을.

9600 보드는 "런 어웨이 프로세스를 쉽게 죽일 수 있음"과 "귀찮게 느리게"간의 절충안입니다.


100 % 야 ... 재미있는;)
화난 84
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.