やりたいこと
Arduinoで特定文字での文字列の分割したいです。
func関数は元の文字列、分割文字、indexを受け取ってindexに沿った文字列を返します。
分割数に指定はなく、分割文字がいくつでも結果を返せる関数です。
完成例1: String str = "Arduino ok"; String part0 = func(str,' ',0); //結果part0 = Arduino String part1 = func(str,' ',1); //結果part1 = ok 完成例2: String str = "Arduino ok hallo"; String part0 = func(str,' ',0); //結果part0 = Arduino String part1 = func(str,' ',1); //結果part1 = ok String part2 = func(str,' ',2); //結果part2 = hallo
ソースコード
Arduino
1#include <stdio.h> 2#include <string.h> 3 4char recieveData[256]; 5char sendData[256]; 6int count = 0 ; 7 8String Func(String data, char separator, int index) 9{ 10 int found = 0; 11 int strIndex[] = {0, -1}; 12 int maxIndex = data.length(); 13 int endcheck = false; 14 15 for(int i=0; i < maxIndex; i++){ 16 if( data.charAt(i) == separator ){ 17 found++; 18 if ( found == index ){ strIndex[0] = i+1; } 19 if ( found == index+1 ){ strIndex[1] = i; endcheck=true; } 20 if(endcheck){ break; } 21 } 22 } 23 //確認用 24 Serial.print("Func関数の確認: "); 25 Serial.print("found" + String(found) + " "); 26 Serial.print("index" + String(index) + " "); 27 Serial.print("strIndex[0]:" + String(strIndex[0]) + " "); 28 Serial.println("strIndex[1]:" + String(strIndex[1])); 29 return (strIndex[1]==-1) ? data.substring(strIndex[0]) : data.substring(strIndex[0], strIndex[1]); 30} 31//分割文字の数 32int Keywordcounter(String Original,char Keyword) { 33 int Keywordcount = 0; 34 for (int i = 0; i < Original.length(); i++){ 35 if (Original.charAt(i) == Keyword) { Keywordcount++; } 36 } 37 return Keywordcount; 38} 39 40void Check_command(String command) { 41 String part[] = {"\0"}; // 分割された文字列を格納する配列 42 char buf[256]; 43 44 command.remove(command.length()-1); //'\n'を消去 45 Serial.println("分割前確認:" + String(command)); 46 47 //分割文字の数 48 int count = Keywordcounter(command, ' '); 49 50 //文字列 = Func(元の文字列,分割文字列,分割した後何番目の文字列か) 51 for (int i = 0; i < count+1; i++){ 52 part[i] = Func(command,' ',i); 53 } 54 55 Serial.print("分割後確認 "); 56 for (int i = 0; i < count+1; i++){ 57 Serial.print(String(i) + ":" + part[i] + " "); 58 } 59 Serial.println(""); 60 Serial.println(""); 61} 62 63void setup() { 64 Serial.begin(9600);//シリアル通信のレートを9600に設定 65} 66 67void loop() { 68 if (Serial.available()) { 69 recieveData[count] = Serial.read(); // 文字列受信 70 if (count > 30 || recieveData[count] == '\n') { 71 Check_command(String(recieveData)); 72 for (int i =0; i <= count; i++) { recieveData[count] == '\0'; } 73 count=0; 74 } else { count++; } 75 } 76} 77
実行結果
foundが0なので、Funcに渡されたdataの内容を確認してみては?
回答2件
あなたの回答
tips
プレビュー