-
시리얼 통신과 문자열 활용 - LEDArduino/Serial 통신 2020. 10. 20. 19:16
1. 시리얼 통신을 통해 문자열을 입력받아 출력
아래의 예제를 실행하면 문제가 있다.
그 이유는 입력받아 출력한 문자들이 계속 변수 str 에 쌓여있어서 기존에 입력한 문자들이 같이 출력된다.
소스 코드
// 시리얼 통신을 통해 문자열을 입력받아 출력하기 void setup() { // put your setup code here, to run once: Serial.begin(9600); } char ch; // 전역 변수 String str; // 전역 변수 void loop() { // put your main code here, to run repeatedly: // 입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다. while (Serial.available() > 0) { ch = Serial.read(); str.concat(ch); // 문자열을 잇는 함수 delay(10); Serial.println(str); } }
2. 시리얼 통신을 통해 문자열을 입력받아 출력 문제 해결1
소스 코드
void setup() { // put your setup code here, to run once: Serial.begin(9600); } char ch; String str; void loop() { // put your main code here, to run repeatedly: // 입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다. while (Serial.available() > 0) { ch = Serial.read(); str.concat(ch); // 문자열을 잇는 함수 delay(10); // 추가한 부분 if (Serial.available() == 0) { Serial.println(str); str = ""; // 버퍼를 비워줘야 한다. 계속 입력한 문자가 쌓여있다. } } }
3. 시리얼 통신을 통해 문자열을 입력받아 출력 문제 해결2
이 예제는 시리얼 모니터에서 '새 줄'을 선택해서 실행해야 한다.
그 이유는 엔터 키 입력을 받아야 하기 때문이다.
즉, 엔터 키 입력 전까지가 우리가 출력할 문자열이다.
소스 코드
void setup() { // put your setup code here, to run once: Serial.begin(9600); } char ch; String str; void loop() { // put your main code here, to run repeatedly: // 입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다. while (Serial.available() > 0) { ch = Serial.read(); // 엔터키가 입력되면 if (ch == '\n') { Serial.println(str); str = ""; break; } str.concat(ch); delay(10); } }
4. 시리얼 통신을 통해 문자열을 입력받아 출력 문제 해결3
소스 코드
// 시리얼 통신을 통해 문자열을 입력받아 출력하기 void setup() { // put your setup code here, to run once: Serial.begin(9600); } char ch; // 전역 변수 String str; // 전역 변수 void loop() { // put your main code here, to run repeatedly: if (Serial.available() > 0) { ch = Serial.read(); str.concat(ch); // 문자열을 잇는 함수 delay(10); // 버퍼에 데이터가 없으면 바로 출력한다. if (Serial.available() == 0) { Serial.println(str); str = ""; // str의 변수의 버퍼를 비운다. } } }
5. 시리얼 통신을 통해 문자열을 입력받아 출력 문제 해결4
아래의 내용을 실행할 때는, 시리얼 모니터에서 '새 줄' 혹은 'Both NL & CR'을 선택하자.
그 이유는 한 문자열의 입력에 대한 조건은 엔터 키가 입력이 될 때까지 이다.
소스 코드
void setup() { // put your setup code here, to run once: Serial.begin(9600); } char buffer[100]; char cnt = 0; char ch; String str; void loop() { // put your main code here, to run repeatedly: // 입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다. while (Serial.available()) { char var = (char)Serial.read(); // 엔터키가 아니면, 데이터를 저장한다. if (var != '\n') { buffer[cnt] = var; cnt++; } // 엔터 키가 입력되면, 한 문자열 입력에 대해 종료 else { buffer[cnt] = '\0'; // 널 문자 삽입 Serial.println(buffer); memset(buffer,0,sizeof(buffer)); cnt = 0; } } }
문자열을 이용하여 LED 켜고 끄기1
소스 코드
// 시리얼 통신을 통해 문자열을 입력받아 // 입력받은 문자열이 ON, OFF일 때 LED를 켜고 끄기 void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(3,OUTPUT); // LED 출력 핀으로 3번 핀을 쓸 것이다. } String str; char ch; void loop() { // put your main code here, to run repeatedly: // 입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다. while (Serial.available() > 0) { ch = Serial.read(); str.concat(ch); // 문자열을 잇는 함수 delay(10); Serial.println(str); if (str == "ON") { digitalWrite(3,HIGH); } else if (str == "OFF") { digitalWrite(3,LOW); } str = ""; } }
문자열을 이용하여 LED 켜고 끄기2
실행 시에 시리얼 모니터에서 '새 줄' 혹은 'Both NL & CR'을 선택해야 한다.
그 이유는 엔터 키 입력을 받아야 한다.
소스 코드
// 시리얼 통신을 통해 문자열을 입력받아 // 입력받은 문자열이 ON, OFF일 때 LED를 켜고 끄기 void setup(){ // put your setup code here, to run once: Serial.begin(9600); } char buffer[100]; char cnt = 0; String str; void loop() { // put your main code here, to run repeatedly: // 입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다. while (Serial.available()) { char var = (char)Serial.read(); // 엔터키가 아니면, 데이터를 저장한다. if (var != '\n') { str += var; } // 엔터 키가 입력되면, 한 문자열 입력에 대해 종료 else { Serial.println(str); if (str.equals("ON")) Serial.println("LED ON"); else if (str.equals("OFF")) Serial.println("LED OFF"); else Serial.println("NOT COMMAND"); str = ""; } } }
문자열을 이용하여 LED 켜고 끄기3
실행 시에 시리얼 모니터에서 '새 줄'을 선택해야 한다.
그 이유는 엔터 키 입력을 받아야 한다.
소스 코드
// 시리얼 통신을 통해 문자열을 입력받아 // 입력받은 문자열이 ON, OFF일 때 LED를 켜고 끄기 void setup(){ // put your setup code here, to run once: Serial.begin(9600); } char buffer[100]; char cnt = 0; String str; void loop() { // put your main code here, to run repeatedly: // 입력한 데이터가 있을 때, 버퍼에서 하나씩 데이터를 읽어들인다. if (Serial.available()) { char var = (char)Serial.read(); // 엔터키가 아니면, 데이터를 저장한다. if (var != '\n') { buffer[cnt] = var; cnt++; } else { buffer[cnt] = '\0'; // 널 문자 삽입 Serial.println(buffer); if (!strcmp(buffer,"ON")) Serial.println("LED ON"); else if (!strcmp(buffer,"OFF")) Serial.println("LED OFF"); else Serial.println("NOT COMMAND"); cnt = 0; memset(buffer,0,sizeof(buffer)); } } }
'Arduino > Serial 통신' 카테고리의 다른 글
아두이노와 아두이노의 시리얼 통신하기 (0) 2020.11.05 Serial Rx Tx & SoftwareSerial Rx Tx (0) 2020.10.20 시리얼 통신에 사용되는 함수 (0) 2020.10.20 시리얼 통신의 활용 - LED와 센서 (0) 2020.10.19 시리얼 통신 기초 (0) 2020.10.19