직렬 모니터의 Arduino Hello World

안녕하세요 직렬 모니터에 무언가를 입력하면 Hello world를 인쇄하지만 문제는 그것뿐입니다. 직렬 모니터의 입력이 3 비트 입력 인 조건에서 hello world를 인쇄하고 그 후에는 계속해서 인쇄를 중지하는 코드가 필요합니다. 내 유일한 문제는 입력의 비트 수를 세는 방법과 연속 인쇄를 중지하는 방법을 알지 못한다는 것입니다.

void setup() { Serial.begin(9600); } void loop() { String readSerial; String input; while(Serial.available() > 0){// put your main code here, to run repeatedly: delay(2); input.concat(String((char)Serial.read())); return input; } Serial.println("HELLO WORLD"); } 

Comments

  • 학교 수업 과제인가요?
  • 코드를 추가하세요.
  • 예, 그렇습니다. 또한 과제이기도합니다. 실제 수업 전에
  • 3 비트 입력이란 정확히 무엇을 의미하나요? 직렬 인터페이스는 전체 바이트 만 전송합니다. 단일 바이트의 8 비트 중 3 개의 특정 값에 관한 것인가요?
  • 여기서 읽을 준비가 된 3 개의 문자 (바이트)는 3 비트입니까? 아니면 내 가정이 잘못 되었습니까?

Answer

댓글을 보면 기본 지식이 약간 늦어집니다.이 과제에서 배워야 할 내용을 실제로 배우려면 학습 자료 또는 웹에서 C / C ++ 및 Arduino 자습서를 검토해야합니다. . 여기서는 과제를 해결하는 데 도움이 될 수있는 추론에 대한 몇 가지 힌트 만 제공합니다. (Unfortu nately 그것은 정말로 명확하지 않습니다, 정확히 무슨 작업이 여기에 있는지)

  • Arduino (UART 인터페이스)의 Serial 인터페이스는 데이터를 한 번에 하나씩 차례로 바이트 (이름 : serial). 1 바이트는 일련의 8 비트이며 각각의 값은 1 또는 0입니다. 8 비트는 함께 값을 형성하며 0에서 255까지의 10 진수 값으로도 표현할 수 있습니다. 예 : 01001011는 십진수 75에 해당하는 이진수입니다. (자세한 설명은 이진수 시스템 google) 바이트 데이터는 ASCII 표준에 정의 된대로 문자로도 표현할 수 있습니다. 모든 이진 값은 특정 문자를 나타냅니다. 이것은 Arduino IDE의 직렬 모니터에서 일어나는 일입니다. (자세한 설명은 google ASCII 참조)
  • 데이터가 직렬로 전송되기 때문에 전송에 약간의 지연이 나타날 수 있습니다. 이는 사람이 알아 채지 못하지만 Arduino는 충분히 빠르므로 Serial.available() 명령은 0을 반환 할 수 있습니다. 그 순간 전송에 약간의 지연이 발생했기 때문입니다. 따라서 작업을 시도하기 전에 전체 메시지를 파악하는 것이 중요합니다. 바이트 수를 세거나 (버퍼에서 3 바이트 이상을 사용할 수있을 때까지 대기) 특수 문자 (예 : 개행 문자 “\ n”)로 메시지 끝을 표시하여이를 수행 할 수 있습니다. 두 가지를 모두 수행하는 방법에 대한 많은 자습서가 웹에 있습니다. Majenko의 블로그 로 시작할 수 있습니다.
  • Serial.available(). 버퍼에 읽을 준비가 된 3 바이트가 있으면 3을 반환합니다.
  • , 함수가 종료되고 재정의 될 때 버려지고, 함수가 다시 시작될 때 (Arduino 세계에서는 void loop() 함수가 계속해서 계속 호출됩니다) .이 변수에 기록 된 모든 콘텐츠를 잃게됩니다. void loop() 함수 실행 동안 데이터를 유지하려면 다음 위치에서 함수 외부의 변수를 정의 할 수 있습니다. 이 변수는 전역 적이며 프로그램 시작시 한 번만 정의되며 프로그램의 전체 수명 동안 유지됩니다.
  • 주석에 작성한대로 값을 반환해서는 안됩니다. void 함수에서, s ince void는 대부분 반환 값이 없음을 의미합니다. 그리고 void loop() 함수에서 돌아 오면이 함수 만 다시 시작됩니다 (Arduino 세계에 있기 때문에).
  • . 그럴 필요가 없습니다. 그리고 그것이 지연으로 만 작동한다면, 다른 것이 정확하지 않으며 실제 문제 대신 증상으로 작업하는 것입니다.

또한 모든 것을 구축하려고 시도해서는 안됩니다. 바퀴를 소유하고 재발 명하십시오. 대신 Arduino IDE와 함께 제공되는 예제를 살펴보십시오. 예를 들어, 직렬 메시지를받는 방법을 보여주는 SerialEvent 예제 (개행 문자 “\ n”로 끝남). 다른 관련 예도 살펴보십시오. 작동 원리를 이해하면 문제없이 과제를 수행 할 수 있습니다.

댓글

  • 안녕하세요. div id = “2d8c43a00f”>

가까워졌지만 한 가지 빠른 질문은 어쨌든 serial.available (); 값을 0으로 되 돌리시겠습니까?

  • Serial.available()가 0을 반환 할 때까지 반환 된 값을 사용하지 않고 Serial.read()를 수행 할 수 있습니다.
  • Answer

    입력 문자의 높이가 3 비트 일 때 스케치가 “Hello World”를 인쇄해야한다고 가정합니다. 다음은 한 바이트에 설정된 비트 수를 계산하는 몇 가지 다른 변형입니다.

    int bits1(int c) { int res = 0; for (int i = 0; i < 8; i++) { if ((1 << i) & c) res = res + 1; } return (res); } int bits2(int c) { int m = 0x80; int res = 0; do { if (m & c) res++; } while (m >>= 1); return (res); } int bits3(int c) { int m = 0x80; int res = 0; do { res += (m & c) != 0; } while (m >>= 1); return (res); } #define bits4(c) __builtin_popcount(c) #define bits bits4 void setup() { Serial.begin(9600); while (!Serial); } void loop() { if (Serial.available() > 0) { int c = Serial.read(); if (bits(c) == 3) { Serial.print((char) c); Serial.print(":"); Serial.print(c, BIN); Serial.println(": Hello World"); } } } 

    답글 남기기

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