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

이것이 무언가를 초기화하는 것임을 압니다.

Serial.begin(9600); 

하지만 저는 그것이 정말로 무엇을 의미하는지 아십니까?

주석

답변

Serial.begin(9600)는 실제로 아무것도 인쇄하지 않습니다.이를 위해”Serial.print("Hello world!")를 사용하여 ” 안녕하세요! ” 직렬 콘솔에. 오히려 직렬 연결을 초당 9600 비트로 초기화합니다.

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

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

댓글

  • 보와 BPS는 서로 다른 두 가지입니다. … ' 지금 찾고 있던 링크를 찾을 수 없습니다.
  • " 일련 번호를 넣으면 어떻게됩니까? .begin (0); " 또는 " Serial.begin (4000); " . 숫자의 차이점을 알고 싶습니다.
  • Serial.begin은 통신 속도를 초당 비트 수로 설정하는 데 사용됩니다. 1 바이트는 8 비트와 같지만 직렬 연결은 시작 및 중지 비트를 전송하여 수신 시스템에 특정 바이트의 시작과 끝을 식별합니다. 따라서 한 문자를 전송하려면 10 비트가 필요합니다. Serial.begin(0)를 사용하면 Arduino에 초당 0 비트로 직렬 통신해야 함을 알립니다. 예상 할 수 있듯이 이것은 Arduino가 데이터를 전혀 보내지 않음을 의미합니다. Serial.begin(4000)는 Arduino가 초당 4000 비트로 데이터를 전송하도록합니다. 이것은 비표준이지만 괜찮습니다.
  • 요약 : 숫자를 변경하면 속도가 변경됩니다. 숫자를 작게 만들면 (예 : Serial.begin(300)) Arduino가 데이터를 더 느리게 전송합니다. 이를 늘리면 57600으로 데이터를 더 빨리 보낼 수 있습니다. 송신 시스템과 수신 시스템 모두 사용할 속도에 동의해야합니다. Arduino 직렬 모니터 창과 같은 컴퓨터 '의 직렬 프로그램을 사용하여 속도를 설정할 수 있습니다. 컴퓨터는 데이터를 수신하지만 일반 속도 인 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 및 11520 비트 / 초 중에서 선택할 수 있습니다. 4000과 같은 다른 속도는 입력 할 수 없습니다 '. 9600이 일반적으로 좋습니다.
  • Baud and BPS are two different things... can't find the link I was looking for now.-여기 '의 설명 하나 : 부록 C : " baud " 대 " bps "

답변

사진은 1000 단어의 가치가 있습니다. 그래서 그들은 (컴퓨터로 작업하는 경우 1024 단어) 이렇게 말합니다. 그래서 저는 사진을 몇 장 게시하겠습니다 …

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

직렬 통신-3 글자

빨간색 음영 부분은 바이트 사이의”유휴 “기간입니다.

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


첫 번째 문자 (문자 “F”또는 0x46 또는 0b01000110)에 대한 자세한 내용은 다음과 같습니다. 여기에 표시 :

직렬 통신-단일 바이트

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

  • B- “시작 비트”. 수신자에게 문자 (바이트)가 전송되기 시작하고 있음을 알리기 위해 행이 낮아집니다. 수신자는 라인을 샘플링하기 전에 1 시간 30 분 동안 대기합니다.

  • C-첫 번째 문자가 도착합니다 (문자 “F”또는 0x46 또는 0b01000110). 클럭 비트가 없기 때문에 들어오는 데이터는 단순히 보오 (전송) 속도로 샘플링됩니다. SPI 통신과 달리 데이터는 최하위 비트에 먼저 도착합니다 (바이트 당 8 비트를 전송하지 않는 경우). 따라서 01000110이 아닌 01100010이 표시됩니다.

  • D-정지 비트. 이 바이트의 끝과 다음 바이트의 시작을 구별 할 수 있도록 항상 높은 값입니다. 시작 비트가 0이고 정지 비트가 1이기 때문에 항상 한 바이트에서 다음 바이트로 명확한 전환이 있습니다.

  • E- 다음 문자.


로직 분석기 캡처에서 T1 - T2가 0.1041667ms라는 것을 알 수 있습니다. 즉, 1/9600 :

1 / 9600 = 0.00010416666 seconds 

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


기타 고려 사항

  • 직렬 통신은 자체 클럭킹되지 않으므로 (SPI 또는 I2C 및 기타와 달리) 발신자와 수신자 모두 클럭 속도에 동의해야합니다.

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

    직렬 전송 속도 오류

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

  • 선택적으로 데이터 비트 뒤에 패리티 비트를 보낼 수 있습니다.

    • “odd”패리티를 지정하면 패리티 비트는 총 1 비트 수가 홀수가되도록 설정됩니다.
    • “짝수”패리티를 지정하는 경우 , 패리티 비트는 총 1 비트 수가 짝수가되도록 설정됩니다.
    • 패리티를 지정하지 않으면 패리티 비트가 생략됩니다.

    이것은 수신기가 데이터가 올바르게 도착했는지 여부를 감지하는 데 도움이 될 수 있습니다.

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

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

  • 두 개의 정지 비트도 가질 수 있습니다. 이것은 기본적으로 바이트 사이의 시간을 늘립니다. 이는 느린 전자 기계 장비가 이전 바이트를 처리 할 수 있도록하기위한 것입니다 (예 : 인쇄).


가능한 손상

If 스트림 중간에 직렬 데이터를 듣기 시작하면 스트림 중간에있는 0 비트가 시작 비트로 해석 될 수 있으며 그 후 수신자가 모든 것을 잘못 해석 할 수 있습니다.

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


역 논리

여기에 표시된 비트 (논리 수준)는 반전되지 않습니다. 즉, 1 비트는 HIGH이고 0 비트는 LOW입니다. -12와 같은 메시지를 보낼 RS232 장비가있는 경우 1 비트의 경우 V, 0 비트의 경우 + 12V. 이는 1이 더 적기 때문에 반전됩니다. 0, 전압 측면.

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


속도 경험 법칙

시작 비트 1 개, 데이터 비트 8 개, 정지 비트 1 개로 총 10 비트가 있기 때문에 간단한 경험으로 바이트 수를 계산할 수 있습니다. 비트 전송률을 10으로 나누어 1 초에 전송할 수 있습니다.

예 : 9600BPS에서 초당 960 바이트를 전송할 수 있습니다.


재현 할 코드 :

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

답변

; TLDR; 직렬 통신 포트를 초기화하고 전송 속도를 설정합니다. 통신하는 장치 (또는 Arduino IDE 직렬 모니터)는 일치하는 전송 속도로 설정해야합니다. 포트를 초기화하면 문자를 보내거나받을 수 있습니다. Arduino 일련 번호 참조

댓글

  • @Nick을 줄이거 나 무시하지 마세요. Gammon '이 주제에 대한 훌륭한 기사입니다.

답글 남기기

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