Arduino/Serial 통신
시리얼 통신과 문자열 활용 - LED
DesignatedRoom
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));
}
}
}