Serial.begin (9600)은 무엇입니까?


답변:


22

Serial.begin(9600)실제로 아무것도 인쇄하지 않습니다. 이를 위해 Serial.print("Hello world!")"Hello world!"라는 텍스트를 인쇄 할 수 있습니다. 시리얼 콘솔에. 오히려 초당 9600 비트로 직렬 연결을 초기화합니다.

알기 쉬운 데이터를 얻으려면 직렬 연결 (예 : Arduino와 컴퓨터)의 양쪽 모두 동일한 속도의 직렬 연결을 사용하도록 설정해야합니다. 두 시스템에서 속도가 생각하는 것 사이에 불일치가 있으면 데이터가 왜곡됩니다.

초당 9600 비트가 Arduino의 기본값이며 대부분의 사용자에게 완벽하게 적합하지만 다른 속도로 변경할 수 있습니다 Serial.begin(57600). Arduino가 초당 57600 비트로 전송하도록 설정합니다. 전송되는 데이터를 보려면 컴퓨터에서 사용중인 소프트웨어 (예 : Arduino IDE의 직렬 모니터)를 동일한 속도로 설정해야합니다.


2
Baud와 BPS는 서로 다른 두 가지입니다. 지금 내가 찾던 링크를 찾을 수 없습니다.
익명 펭귄

"Serial.begin (0);"을 넣으면 어떻게 되나요? 또는 "Serial.begin (4000);". 숫자의 차이점이 무엇인지 알고 싶습니다.
shajib0o

3
Serial.begin은 초당 비트 수로 통신 속도를 설정하는 데 사용됩니다. 1 바이트는 8 비트와 동일하지만 직렬 연결은 시작 및 중지 비트를 전송하여 특정 바이트의 시작 및 끝을 수신 시스템으로 보냅니다. 따라서 한 문자를 보내려면 10 비트가 필요합니다. 를 사용 Serial.begin(0)하면 Arduino에게 초당 0 비트의 직렬 통신을해야합니다. 예상 한대로 Arduino는 데이터를 전혀 보내지 않습니다. Serial.begin(4000)Arduino가 초당 4000 비트로 데이터를 전송하게합니다. 이것은 비표준이지만 그렇지 않으면 괜찮습니다.
heypete

2
한마디로 : 숫자를 변경하면 속도가 변경됩니다. 숫자를 작게 만들면 (예 Serial.begin(300):) Arduino가 데이터를 더 느리게 보냅니다. 57600으로 늘리면 데이터가 더 빨리 전송됩니다. 송신 시스템과 수신 시스템 모두 사용 속도에 동의해야합니다. Arduino 직렬 모니터 창과 같은 컴퓨터의 직렬 프로그램을 사용하면 컴퓨터가 데이터를받는 속도를 설정할 수 있지만 공통으로 만 선택할 수 있습니다 속도 : 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 및 11520 비트 / 초 4000과 같은 다른 속도는 입력 할 수 없습니다. 9600이 일반적입니다.
heypete

Baud and BPS are two different things... can't find the link I was looking for now.-여기에 하나의 설명이 있습니다 : 부록 C : "baud"vs. "bps"
Nick Gammon

21

그림은 1000 단어의 가치가 있으므로 (컴퓨터로 작업하는 경우 1024 단어) 그래서 일부 그림을 게시 할 것입니다 ...

9600 보드에서 "Fab"을 보내도록 Uno를 설정하고 결과를 로직 분석기에서 캡처했습니다.

시리얼 통신-3 글자

빨간색으로 표시된 부분은 바이트 사이의 "유휴"기간입니다.

위의 그래픽에서 Tx (전송) 데이터 라인은 문자의 시작 (바이트)을 나타 내기 위해 낮게 떨어질 때까지 일반적으로 높습니다 (1). 이것은 시작 비트 입니다. 그런 다음 8 개의 데이터 비트 (흰색 점으로 표시)가 전송 속도 (초당 9600 개 샘플)로 나타납니다. 그 후 라인이 다시 높아집니다. 정지 비트 (빨간색 부분)입니다. 그런 다음 다음 문자의 시작 비트 등이 표시됩니다. "정지"부분은 무한정 길 수 있지만, 적어도 하나의 비트 길이 여야합니다.


첫 번째 문자 (문자 "F"또는 0x46 또는 0b01000110)에 대한 자세한 내용은 여기에서 볼 수 있습니다.

직렬 통신-단일 바이트

  • A-데이터 없음 (Tx가 높음)

  • B- "시작 비트" 수신자에게 문자 (바이트)가 전송을 시작한다고 알리기 위해 행이 줄어 듭니다. 수신기는 라인을 샘플링하기 전에 1.5 클럭 시간을 기다립니다.

  • C-첫 문자가 도착합니다 (문자 "F"또는 0x46 또는 0b01000110). 클럭 비트가 없으므로 들어오는 데이터는 단순히 전송 속도로 샘플링됩니다. SPI 통신과 달리 데이터는 가장 중요도가 낮은 비트부터 먼저 도착합니다 (바이트 당 8 비트를 보내지 않는 경우). 따라서 우리는 01000110이 아닌 01100010을 봅니다.

  • D-정지 비트 이 바이트의 끝과 다음 바이트의 시작을 구별 할 수 있도록 항상 높습니다. 시작 비트는 0이고 정지 비트는 1이므로 항상 한 바이트에서 다음 바이트로 명확하게 전환됩니다.

  • E-다음 문자의 시작 비트


로직 분석기 캡처에서 T1 - T20.1041667 ms이며 1/9600입니다.

1 / 9600 = 0.00010416666 seconds

따라서 9600의 속도는 초당 비트 수를 제공 하고 그 반대는 비트 사이시간 간격 입니다.


다른 고려 사항

  • 직렬 통신은 SPI 또는 I2C 및 기타와 달리 자체 클록이 아니므로 송신자와 수신자 모두 클록 속도에 동의해야합니다.

  • 하드웨어가 직렬 클록을 얻기 위해 시스템 클록을 나누어야하고 분할이 항상 정확한 것은 아니기 때문에 Arduino의 클록 속도는 정확하지 않습니다. 거의 항상 오류가 있으며, 그 양은 데이터 시트에 나와 있습니다 (Uno와 같은 16 MHz 시스템 클록에 대해 인용 된 그림).

    직렬 전송 속도 오류

  • 데이터 비트 수를 다양하게 지정할 수 있으며 그 중 8 개를 전송할 필요가 없으며 실제로 5 ~ 9 비트를 보낼 수 있습니다.

  • 선택적으로 데이터 비트 다음에 패리티 비트가 전송 될 수 있습니다 .

    • "odd"패리티를 지정하면 패리티 비트는 총 1 비트 수가 홀수 인 방식으로 설정됩니다.
    • "짝수"패리티를 지정하면 패리티 비트는 총 1 비트 수가 짝수로 설정됩니다.
    • 패리티를 지정하지 않으면 패리티 비트가 생략됩니다.

    이를 통해 데이터가 올바르게 도착했는지 여부를 수신자가 감지 할 수 있습니다.

  • 패리티 비트는 정지 비트보다 먼저 전송됩니다.

  • 9 개의 데이터 비트 (SeaTalk 프로토콜에서 사용)의 경우 패리티 비트는 9 번째 데이터 비트로 용도 변경됩니다. 따라서 9 개의 데이터 비트와 패리티 비트를 모두 가질 수는 없습니다.

  • 두 개의 정지 비트를 가질 수도 있습니다. 이것은 기본적으로 바이트 사이의 시간을 연장시킵니다. "구시대"에서 이것은 느린 전자 기계 장비가 이전 바이트를 처리 할 수 ​​있도록 (예를 들어, 인쇄하기 위해)되었다.


가능한 부패

스트림 중간에서 직렬 데이터를 청취하기 시작하면 스트림 중간의 0 비트가 시작 비트로 해석되어 수신자가 그 이후의 모든 내용을 잘못 해석 할 수 있습니다.

이를 복구하는 유일한 방법은 때때로 발생할 수없는 충분한 간격 (예 : 10 비트 길이)을 두는 것입니다.


역 논리

여기에 표시된 비트 (논리 수준)는 반전되지 않습니다. 즉, 1 비트는 HIGH이고 0 비트는 LOW입니다. RS232 장비를 사용하는 경우 1 비트의 경우 -12V, 0 비트의 경우 + 12V와 같은 신호를 보낼 수 있습니다. 1은 전압 방식으로 0보다 작기 때문에 반전됩니다.

이러한 장치가있는 경우 전압 변환 및 논리 반전을 수행해야합니다. MAX232 와 같은 칩 은 모두 당신을 위해 할 것입니다. 또한 몇 가지 사용자 제공 커패시터를 사용하여 내부적으로 장비를 생성함으로써 이러한 장비를 구동하는 데 필요한 -12V를 제공 할 수 있습니다.


속도 규칙

시작 비트 1 개, 데이터 비트 8 개 및 정지 비트 1 개로 총 10 비트가 있으므로 빠른 경험을 위해 비트 전송률을 10으로 나누어 초당 전송 가능한 바이트 수를 계산할 수 있습니다. .

예 : 9600 BPS에서는 초당 960 바이트를 보낼 수 있습니다.


재현 할 코드 :

void setup() 
  { 
  Serial.begin(9600); 
  Serial.print("Fab"); 
  } 

void loop ()
  {
  }

1

TLDR; 직렬 통신 포트를 초기화하고 전송 속도를 설정합니다. 통신중인 장치 (또는 Arduino IDE Serial Monitor)가 일치하는 전송 속도로 설정되어 있어야합니다. 포트를 초기화하면 문자를 보내거나받을 수 있습니다. 아두 이노 시리얼 레퍼런스


@ Nick-Gammon의이 주제에 대한 뛰어난 적용 범위를 줄이거 나 무시하지 마십시오.
linhartr22

-3

컴퓨터 시스템 내부에서 작동하는 프로그램을 지정합니다. 숫자는 속도를 지정합니다. Serial.print는 표시 할 텍스트를 지정합니다.


3
이것이 현재 허용되는 답변에 추가되는 것은 무엇입니까?
Ignacio Vazquez-Abrams

1
쓸모없는 답변, 투표 투표
smirkingman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.