Conversão Char

Olá pessoal,
ja tenho um tempo de experiencia com arduino porem estou com dificuldade em converter e manipular string.

Gostaria de saber como tornar uma integer em duas integer. ex:

tenho,
recebo via serial

Serial.read() = #1#123;

gostaria de tirar os "#" e deixar os numeros em duas integer diferentes:

int x = 1;
int z = 123;

Somente isso .

Desde já agradeço!

char str[7];
int numero1 = 0;

str[0] = Serial.read(); //isto é o "1"
numero1 = str[0] - '0'; //vê aqui http://www.asciitable.com/

Mas o que tu estás a ter dificuldade é em fazer um string parsing.

Então seria algo assim:

char str[7];
unsigned char counter = 0;
char c;
unsigned int numero1; 

if (Serial.available() > 2) {

if (Serial.read() == "#") { //inicio da trama...
   while ((c=Serial.read) != "#") { //fica aqui até encontrar o final da outra trama... 
      str[counter++] = c;
      if (counter >= 5) {
          break; // sai do loop
      }
   }   
}
str[counter] = '\0';
numero1 = atoi(str);

}

No entanto, este protocolo tem problemas... é sempre mais simples ter um caracter de inicio e fim. E é mais simples teres o número de caracteres fixos.
Ou então, podes fazer uma transmissão binária.

Creio que as propostas do bubulindo sejam mais indicadas ao arduino, eu testei o abaixo e uso algo parecido para tratar uma sequencia de 20 parâmetros delimitado por virgula, alimentando um array.

eu passo via PC comandos como SetP(1024,1024,1024)

char SerialBuffer[19];   //Array to hold incoming data

int paramR = 0; //Right Sensor Value
int paramC = 0; //Center Sensor Value
int paramL = 0; //Left Sensor Value

void Tok(){
  int newParamL,newParamC,newParamR;
  int errors = 0;

  char *chpt = strtok(SerialBuffer, "("); //Split string into tokens
  if (chpt == NULL) {
    Serial.println("strtok returns NULL");
  }
  else {
    if(strcmp(chpt, "SetP") == 0){

      chpt = strtok(NULL, ",");
      if (chpt == NULL) {
          Serial.println("First param strok returns NULL");
          ++errors;
      }
      else {
          Param[0] = atoi(chpt); //Convert to integer
      }
      
      if (errors == 0) {
          chpt = strtok(NULL, ",");
          if (chpt == NULL) {
              Serial.println("Second param strok returns NULL");
              ++errors;
          }
          else {
              Param[1] = atoi(chpt);
          }
      }
      
      if (errors == 0) {
          chpt = strtok(NULL, ")");
          if (chpt == NULL) {
              Serial.println("Third Param strok returns NULL");
              ++errors;
          }
          Param[2] = atoi(chpt);
      }
      
      if (errors == 0) {
        paramL = newParamL;
        paramC = newParamC; 
        paramR = newParamR;

        SetParameters();
      }
    }
  } 
}

Mortis, esses strcmp saem muiito "caros" ao arduino em processamento.

também não é muito bom usar o strcmp, é melhor o strncmp.

Idealmente se não tiveres de comparar strings, tanto melhor.

Isto é interessante para os posts que estou a escrever no meu blog sobre protocolos.

Olá, bubulindo!

Muito obrigado pela dica, é um tanto difícil perceber algumas coisas quando saímos de “linguagens modernas” (C#) e entramos no C/C++ para microcontroladores, percebo que a maioria dos novatos (como eu) dão cabeçadas para organizar as ideias, por exemplo, sobre char(s) e strings :blush:.

Pelo que percebi, ambos strncmp e strcmp fazem um loop para comparar as strings (char por char), a vantagem do strncmp é delimitamos o número de chars comparados, é isso?

em termos de uso do strncmp ou do método que você sugeriu:

while ((c=Serial.read) != "#") { //fica aqui até encontrar o final da outra trama... 
      str[counter++] = c;
      if (counter >= 5) {
          break; // sai do loop
      }
   }

Ambos não correm o array da mesma forma?

Nos diga quando tiveres escrito os posts :wink:

Sim, historicamente o strcmp não é uma função segura. Existem várias vulnerabilidades de sistemas antigos por causa dessa função.

O que eu escrevi não compara. Guarda os caracteres numa strting para depois converter em inteiro. o strcmp compara com outra string. É diferente.

eu já escrevi alguns... estão em microsrus.blogspot.com.

Ontem já coloquei as bibliotecas online, então não tarda nada vou escrever sobre como usá-las.

Bubulindo, Obrigado!

Creio que percebi (rs), mas preciso amadurecer um pouco as ideias.

Passei os olhos por teus artigos, muito bom! Aguardo o próximo sobre os formatos de mensagem :wink:

Muito bom os comentarios de vocês , o código do Mortis mesmo eu lendo que pode ter falhas , eu acho mais apropriado e simples para meu tipo de projeto. Devido a não ser uma coisa complexa e que exija 100% de eficácia na transmição .

Nota 100

Vinicius,

Fico feliz em ajudar! O problema do meu código é que ele é mais pesado, pois uso duas funções strtok e strcmp (e consequentemente mais memória). O método do bubulindo é mais leve e rápido.

Criei o método com a intenção de usar chamadas da mesma forma que fazemos em um computador "nome do método(parâmetros, ...)", mas aprendi que com microcontroladores temos de ter mais cuidados por causa do uso da memória e da capacidade de processamento. Mas é certo que depende do tipo de aplicação e dos resultados esperados :wink:

Boa diversão por ai!