개발 관련/HW 관련

아두이노 - String Split

by 소서리스25 2024. 4. 3.
반응형

아두이노에서는 기본적으로 C#이나 JAVA의 split 기능을 지원하지 않는 것 같다. 아니면 내가 잘 모르니 못 찾을 것 일수도 있다. 아무리 찾아봐도 아두이노에서의 저 기능을 못 찾겠다.

substring 기능이나 indexof 기능 외에는 찾아봐도 안 나오니 결국 이것을 활용한 방법으로 원하는 기능을 수행할 수밖에 없다. 그래서 split 기능을 수행하는 코드를 만들어 봤다.

아래의 코드를 활용하면 한 번에 들어온 여러 문자열을 구분자의 기준으로 분리하여 배열에 넣어준다. 일단 배열은 20개 이하만 처리하도록 했는데 필요하면 숫자만 늘리면 된다.

 

이 기능의 활용은 로봇제작에서 명령어를 한 개씩 전달하기보다는 진행할 문자열을 한 번에 보내서 처리하도록 하는 것이 좋겠다 싶어서 만들었다. 

물론 짧게 한 개 만을 보내도 되고 여러 개를 보내도 상관없이 작동할 것이다. (아마도...)

아직은 적용한 것이 아니라 실제적인 작동은 합쳐봐야 알 것 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// gz015n50, gx035n50, gc110n50, gv135n50, gz015n50, gx035n50, gc110n50, gv135n50, e
 
String _inString = " ";
String _inputActions[20= {}; // 20개정도 명령어 받아보기
int _count = 0;
 
void setup() 
{
  Serial.begin(9600);
  Serial.setTimeout(40);
  Serial.println(F("Start~"));
  delay(500);
}
 
void loop() 
{
  delay(20);
  
  if(Serial.available()>0)
  {
    _inString = Serial.readString();
    Serial.println(_inString);
 
    StringSplit(_inString);
 
    Serial.println(F("input data : "));
    for(int i = 0; i<_count; i++)
    {
      Serial.println(_inputActions[i]);
    }
  }
 
}
 
void StringSplit(String inputString)
{
  _count = 0;
  int _getIndex = 0;  
  String _tempString = "";
  String _getString = inputString;  
 
  while(true)
  {
    _getIndex = _getString.indexOf(','); // ','으로 분리된 문자
    
    if(_getIndex != -1// ','이 있을 경우
    {
      _tempString = _getString.substring(0, _getIndex); // 임시로 ',' 앞부분 문자 가져옴
      //Serial.println(_tempString); // 읽은 문자 출력
 
      _inputActions[_count] = _tempString; // 명령어 배열에 넣기
 
      _getString = _getString.substring(_getIndex + 1); // 앞문자 자르고 다음 전체문자로 저장
      _getString.trim();  // 공백 제거
      
    } else {
      break// 없으면 종료
    }
    _count++;
  }
  //Serial.println(_count); // 전체 문자열의 수
}
cs

 

 

결과는 다음과 같다. 잘 되는 것 같다.

결과 화면
결과 화면

 

반응형

댓글