arduino serial communication 아두이노 시리얼통신

char dataChar[10];
int charCount = 0;
boolean reading = false;

  if(Serial.available()){
     char val;
     val = Serial.read();
     if(val == ']'){
       Serial.print("[data:");
       Serial.print(dataChar);
       Serial.print("]");
       Serial.print("\n");
       if(dataChar[0] == 's'){
         loopNum = 0;
       }else if(dataChar[0] == 'c'){
         loopNum = 1;
       }else if(dataChar[0] == 'w'){
          loopNum = 2;
       }else{
         reading = false;
         val_int = atoi(dataChar);
         //Serial.print(val_int);
         //rolling(val_int);
         //rolling(100);
       }
     }
     if(reading){
       dataChar[charCount] = val;
       charCount ++;
     }
     if(val == '['){
       reading = true;
       for(int i=0; i<10; i++){
         dataChar[i] = 0;
       }
       charCount = 0;
     }
   }
  • [시작, ]끝, 으로 내부에 명령어를 넣고 아두이노에서 명령어를 걸러내는 방식

더 간소화

void setup() {
  Serial.begin(9600);
}
void loop() {
  if (Serial.available() > 0) {
    String str = Serial.readString();
    Serial.println(str);
  }
  delay(10);
}
  • 구현은 쉬운편이지만 타임아웃까지 기다렸다가 후처리 하는 방식으로 2.5초 정도의 딜레이가 생긴다

다른방식

void setup() {
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}
char dataChar[10];
char dataCount=0;
String full_string;
void loop() {
  full_string = "";
  while (Serial.available() > 0) {
    char chr = Serial.read();
    String str(chr);
    Serial.println(str);
    full_string += str;
  }
  if(full_string != "")Serial.println(full_string);
  if(full_string == "01000\n"){ //개행문자 \n 까지 포함하여 검사
    digitalWrite(13,HIGH);
  }else if(full_string == "02000\n"){
    digitalWrite(13,LOW);
  }
  delay(10);
}
  • 한큐에 다 들어오기 때문에 받아지긴 하는데, 시스템에 따라 쪼개져서 들어오는 경우가 없는지 확인해야함

세마포(semaphore) 제한 시간이 만료되었습니다.

  • 아두이노에 read 부분이 구현되어 있지않아 serial를 발송하였지만 받아주지 않았음
  • Unity에서 송신 완료를 대기하다가 timeout 되는 증상이 발생