Saudações.
Estou tendo problemas para realizar a filtragem de uma string. Meu projeto, recebe via serial a seguinte string:
"[SERVER] [DATA] 10/09/21 [HORA] 15:12 [N] 8 [Permissao_I] OK [Apelido_C1] A [Modo_C1] Set_Point [SetPoint_C1] 90 [Pedido_I_C1] 1 [P_I_C1] 1 [Apelido_C2] B [Modo_C2] Horario [C_I_H_C2] 0 [N_Irrigacoes_C2] 2 [Pedido_I_C2] 1 [P_I_C2] 1 [Apelido_C3] C [Modo_C3] Set_Point [SetPoint_C3] 50 [Pedido_I_C3] 1 [P_I_C3] 1 [Apelido_C4] D [Modo_C4] Set_Point [SetPoint_C4] 50 [Pedido_I_C4] 1 [P_I_C4] 1 [Apelido_C5] E [Modo_C5] Set_Point [SetPoint_C5] 50 [Pedido_I_C5] 1 [P_I_C5] 1 [Apelido_C6] F [Modo_C6] Set_Point [SetPoint_C6] 50 [Pedido_I_C6] 1 [P_I_C6] 1 [Apelido_C7] G [Modo_C7] Set_Point [SetPoint_C7] 50 [Pedido_I_C7] 0 [P_I_C7] 1 [Apelido_C8] [Modo_C8] Set_Point [SetPoint_C8] 50 [Pedido_I_C8] 0 [P_I_C8] 1 [Mensagem] Nada Consta".
E eu preciso armazenar as informações dessa string, e armazená-las nas variáveis entre colchetes.
Através de um laço for, armazeno as informações em sua respectiva variável, contida num array de classe, como segue o código:
for (int i=0; i<Sistema.N_C; i++) {
//---------------------------------------------------------------------APELIDO
if(string_parcial2.indexOf("[Apelido_C"+String(i+1)+"]")>=0){
Pos = string_parcial2.indexOf("[Apelido_C"+String(i+1)+"]");
string_parcial = string_parcial2.substring(Pos + String("[Apelido_Cx]").legth());
Area[i].Apelido = string_parcial.substring(0, string_parcial.indexOf(" "));
Serial.println("Apelido"+String(i+1)+":"+string_parcial.substring(0,string_parcial.indexOf(" ")));
}
//-------------------------------------------------------------------------Pedido
if(Resultado.indexOf("[Pedido_I_C" + String(i) + "]")>=0){
Pos = Resultado.indexOf("[Pedido_I_C" + String(i) + "]");
string_parcial = Resultado.substring(Pos + String("[Pedido_I_Cx]").length());
Area[i].pedido = (string_parcial.substring(0, string_parcial.indexOf(" "))).toInt();
Serial.println("Pedido "+String(i)+":"+string_parcial.substring(0, string_parcial.indexOf(" ")));
}
//-----------------------------------------------------------------------------Permissao
if(Resultado.indexOf("[P_I_C" + String(i) + "]")>=0){
Pos = Resultado.indexOf("[P_I_C" + String(i) + "]");
string_parcial = Resultado.substring(Pos + String("[P_I_Cx]").length());
Area[i].Permissao = (string_parcial.substring(0, string_parcial.indexOf(" "))).toInt();
Serial.println("Permisssao "+String(i)+":"+string_parcial.substring(0, string_parcial.indexOf(" ")));
}
//-------------------------------------------------------------------------MODO
if(Resultado.indexOf("[Modo_C" + String(i) + "]")>=0){
Pos = Resultado.indexOf("[Modo_C" + String(i) + "]");
string_parcial = Resultado.substring(Pos + String("[Modo_Cx]").length());
Area[i].Modo = string_parcial.substring(0, string_parcial.indexOf(" "));
Serial.println("Modo "+String(i)+":"+string_parcial.substring(0, string_parcial.indexOf(" ")));
if (Area[i].Modo == "Horario") { //-----------------------------------------------------------------------Modo de Horario
if(Resultado.indexOf("[C_I_H_C" + String(i) + "]")>=0){
Pos = Resultado.indexOf("[C_I_H_C" + String(i) + "]");
string_parcial = Resultado.substring(Pos + String("[C_I_H_Cx]").length());
Area[i].comando_i_horario = (string_parcial.substring(0, string_parcial.indexOf(" "))).toInt();
Area[i].Umidade = 0;
}
}
else if (Area[i].Modo == "Set_Point") { //------------------------------------------------------------------------------Modo Set_Point
Pos = Resultado.indexOf("[SetPoint_C" + String(i) + "]");
string_parcial = Resultado.substring(Pos + String("[SetPoint_Cx]").length());
Area[i].Set_Point = (string_parcial.substring(0, string_parcial.indexOf(" "))).toInt();
Serial.println("SetPoint "+String(i)+":"+string_parcial.substring(0, string_parcial.indexOf(" ")));
}
}
}
Entretanto, esse código funciona apenas para uma quantidade de até 6 áreas, quando passa dessa quantidade, a função substring não consegue mais separar os dados.
Para resolver o problema, criei outra função para quebrar a string completa em 8 strings menores, como feito no código abaixo:
for (int i=0; i<8; i++){
area[i].string_parcial=string_parcial2.substring(string_parcial2.indexOf([Apelido_C"+String(i+1)+"]"),string_parcial2.indexOf("[P_I_C"+String(i+1)+"]")+String("[P_I_Cx]").length()+2);
}
Entretanto, o arduino consegue separar as strings menores para até 7 áreas. Quando é adicionado mais que 7, as substrings não são separadas.
Tentei realizar o processo com a função remove(), onde a cada laço, a substring já separada era excluída da string inteira, para o arduino conseguir processar com maior facilidade, mas também não funciona. Alguém pode me dar uma luz de como posso realizar essa separação das variáveis?
Desde já, grato.