매우 기본적인 Arduino Uno Serial.readString () 작업

저는 Arduino 프로그래밍을 처음 접합니다. 직렬 모니터에서 입력 문자열을 식별하고 그에 따라 콘솔에 출력을 인쇄하려고합니다.

코드는 다음과 같습니다.

void setup() { Serial.begin(9600); } void loop() { while (Serial.available() > 0 ) { String str = Serial.readString(); if (str.equals("send")) { Serial.println("identified"); } else { Serial.println("unknown"); } } } 

출력으로 “알 수 없음”을 표시하는 전송 문자열을 넣으십시오. 이는 잘못된 것이며 출력으로 “식별”되어야합니다. 누구든지 결과를 얻기 위해 나를 여기로 안내 할 수 있습니까?

참고 : readStringUntil 함수를 사용하여 원하는대로 출력을 얻고 있지만 문자열에는 “.”가 많이 있습니다. 따라서 유용하지 않습니다.

설명

  • 직렬 모니터에서 라인 끝 설정은 무엇입니까?
  • NL 및 CR.
  • 그런 다음 " send / r / n "
  • 를 확인합니다.

  • \r\n /r/n
  • readString과 같은 것에 의존하는 문제는 당신이 정말로하지 않는다는 것입니다. ' 그들이 무엇을하고 있는지 또는 어떻게 작동하는지 모릅니다. 수신 데이터를 수동으로 구문 분석하여 작업중인 데이터를 알 수 있습니다.

Answer

설정 한 경우 Serial Monitor의 줄이 “Both NL & CR”로 끝나는 경우이 코드는 “send”라는 단어를 찾습니다.이 문자열에서 “send”라는 단어는 찾지 못합니다. “ssend”또는이 문자열에서 “sendd”.

void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.substring(0) == "send\r\n"){ Serial.println("identified");} else{ Serial.println("unknown"); } } } 

“1234send”또는 “send1234″에서 “send”문자열을 찾으려면 또는 “1234send5678″그런 다음 indexOf ();

void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.indexOf("send") > -1){ Serial.println("identified");} else{ Serial.println("unknown"); } } } 

Answer

* .equals 테스트가 거짓 인 이유는 여러 가지가 있습니다. 통신 소스에서 도입 된 대소 문자 차이 또는 추가 문자를 고려하십시오. 인쇄 할 수없는 문자도 문제를 일으키고 테스트에 실패 할 수 있습니다.

사용 고려 대신 *. substring () . 하위 문자열이 발견되면이 메서드는 true를 반환합니다. 예 :

 String stringOne = "12345 send 1234"; // substring(index) looks for the substring from the index position to the end: if (stringOne.substring(0) == "send") { Serial.println("identified"); } else { Serial.println("unknown"); } 

… 항상 문자열 “s”, “e”, “n”및 “d”가 문자열 stringOne 내에서 올바른 시퀀스에 있으므로 “identified”를 반환합니다.

코멘트

  • 문자열 str = Serial.readString (); if (str.substring (0) == " 보내기 ") Serial.println (" 식별 됨 "); else Serial.println (" 알 수 없음 "); 이것도 작동하지 않았습니다.
  • 이상합니다. 하위 문자열을 올바르게 사용하고 있는지 확인하기 위해 링크 된 웹 페이지를 보셨습니까? (이 웹 페이지? ). 또한 댓글을 통해받은 문자열을 인쇄하고받은 메시지에서 " send "를 보았습니다. 옳은? 직렬 읽기 행을 주석 처리하고 " String str = " 12345 send 1234 ; "를 사용하여 모든 것이 작동하는지 테스트합니다. 신속하게 보내려고 할 수있는 다른 댓글이 있는지 판단합니다 (입력). " space " + " 보내기 " + " space " (" ")를 전송하여 작동하는지 확인합니다.
  • 이는 ' 작동하지 않습니다. substring (n)은 위치 n에서 시작하는 문자열 부분 만 반환합니다. 따라서 substring (0)은 문자열의 복사본을 반환합니다. str.substring (0,4)는 문자열의 처음 4자를 반환합니다 (반환 할 문자가 4 자 미만이라고 가정합니다.이 구현에 대해 잘 알지 못해서 무엇을 알 수 있는지 ' 더 짧은 문자열에 대해 수행합니다. C #에서는 예외가 발생합니다.

Answer

void setup() { Serial.begin(9600); } void loop() { char inChar[5]; if(Serial.available() > 0 ) { for (int i=0; i<5; i++) { inChar[i] = Serial.read(); delay(10); } if (inChar[0] == "s" && inChar[1] == "e" \ && inChar[2] == "n" \ && inChar[3] == "d") { Serial.println("identified"); } else { Serial.println("unknown"); } } } 

댓글

  • 문자열 읽기 " 보내기 " Serial.readString () 명령을 사용하는 것이 좋습니다. 그러나 비교를 위해 결과를 사용하면 어떻게 든 작동하지 않습니다 (예 : data == " send " …). 가능한 해결책은 문자 배열 (예 : inChar [5])을 사용하는 것입니다. 배열의 크기가 필요한 최대 문자보다 1 개 더 많습니다.

답글 남기기

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