Go Down

Topic: CONVERSÃO (Read 1 time) previous topic - next topic

Kotch

Nao consigo entender e nao consigo converter, por favor uma ajuda!

//declaro a variavel
String dados="a";
int servo=56;

//CONVERTO SERVO QUE É UM INTEGER PARA DADOS QUE É UMA STRING
servo = atoi(dados);

//CONVERTO DADOS QUE É UMA STRING PARA SERVO QUE É UM INTEGER
dados = itoa(servo);

qual o problema?   :smiley-sad-blue:
????????????????????

bubulindo

O teu problema é a definicão de String.
Ora vê aqui:

http://arduino.cc/en/Reference/StringObject 

como o URL indica, a String é um objecto, não um vector de caracteres.

Uma string, é isto: http://arduino.cc/en/Reference/String  e se fores ver à libc para AVR, o atoi() lida com vectores de caracteres, não com Strings do Arduino.

Conselho, esquece a String e usa vectores. Lembra-te que o Arduino é um micro de 8 bits. Andar com implementacões de alto nível para algo desnecessário (como a String) só torna as coisas piores.

Para o teu exemplo:

Code: [Select]


char dados [3]={'a', '\0'};
int servo=56;

//CONVERTO SERVO QUE É UM INTEGER PARA DADOS QUE É UMA STRING
servo = atoi(dados);

//CONVERTO DADOS QUE É UMA STRING PARA SERVO QUE É UM INTEGER
itoa(servo, dados, 10);//em vez de 10, podes colocar 2, ou 8 ou 16 para veres o resultado em base binária, octal ou hexadecimal.


manual do itoa  -> http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga4f6b3dd51c1f8519d5b8fce1dbf7a665

This... is a hobby.

Kotch

OK, obrigado pelo caminho das pedras!
:)
????????????????????

Kotch

#3
Jun 29, 2012, 02:15 am Last Edit: Jun 29, 2012, 02:21 am by Kotch Reason: 1
Faz um mes que tento resolver esta M#R#A, e não consigo, ja li tudo que tem na internet sobre atoi e simplesmente não rola!
Formato do dados vindos pela serial:
17xx21yyy1317xx21yyy1317xx21yyy13...
xx= 00 ate 90
yyy= 000 ate 360
13=fim de dados e o ciclo recomeça.

O objetivo do programa é ler a serial se for 17, os proximos 2 caracteres devem ser enviados pra um servo
depois vem o 21, indicando que os proximos 3 caracteres devem ser enviados pra outro servo
ai vem o  13 indicando que acabaram os dados e o ciclo recomeça.



parte do programa:
int serialIn = 0;
int value = 0;

char valor;
String funcao="";

char dados[]="0";

String Elevacao="";
String Azimute="";
int servoAzimute=0;
int servoElevacao=0;

void loop() {
if (Serial.available() > 0) {
   serialIn = Serial.read();  //serialIn == integer
         if(serialIn == 13) {
            value = 0;  //value == integer
         }
else
value = value * 10 + serialIn - 0x30;
String valor = String(value);
String funcao = valor.substring(0,2);
String dados = valor.substring(2,5);

if (funcao == "17") {
   int servoAzimute = atoi (dados);
   myservo.write(servoAzimute);
}

if (funcao == "21") {
   int servoElevacao = atoi (dados);
   myservo.write(servoElevacao);
}
delay(100);
}
}

ERRO:
cannot convert 'String' to 'const char*' for argument '1' to 'int atoi(const char*)'




Obrigado!
????????????????????

bubulindo

Espero que tenhas lido isto...

Conselho, esquece a String e usa vectores. Lembra-te que o Arduino é um micro de 8 bits. Andar com implementacões de alto nível para algo desnecessário (como a String) só torna as coisas piores.



Code: [Select]
int serialIn = 0;
int value = 0;

char valor;
String funcao="";

char dados[]="0";

String Elevacao="";
String Azimute="";
int servoAzimute=0;
int servoElevacao=0;

void loop() {
if (Serial.available() > 0) {
    serialIn = Serial.read();  //serialIn == integer
          if(serialIn == 13) { //tens a certeza disto?
             value = 0;  //value == integer
          }
else
value = value * 10 + serialIn - 0x30;
String valor = String(value);
String funcao = valor.substring(0,2);
String dados = valor.substring(2,5);

if (funcao == "17") {                     //isto não funciona strcmp() é o que precisas
    int servoAzimute = atoi (dados);
    myservo.write(servoAzimute);
}

if (funcao == "21") {                     //isto não funciona strcmp() é o que precisas
    int servoElevacao = atoi (dados);
    myservo.write(servoElevacao);
}
delay(100);
}
}


Depois não sabes exactamente onde comecam os dados... logo antes de mais tens de testar quando comecam os dados e ir descartando o que não importa.

Code: [Select]


if (Serial.read() == '1') {
   if (Serial.read() == '3') {
      if (Serial.read() == '1') {
         if (Serial.read() == '7') { //próximos dados serão XX
              vect[0] = Serial.read();
              vect[1] = Serial.read();
              vect[2] = '\0';
              azimute = atoi(vect);
              Serial.read(); //2
              Serial.read(); //1
              vect[0] = Serial.read();
              vect[1] = Serial.read();
              vect[2] = Serial.read();
              vect[3] = '\0';
              elevacao = atoi(vect);
}}}}

Sem compilar, isto deve funcionar...
Mais uma vez NUNCA USES O OBJECTO STRING!!!!!
This... is a hobby.

Kotch

Ok Bubulindo, chega de string mesmo, mudei o codigo e agora ta "rodando" legal, obrigado pela ajuda!

8)
????????????????????

Kotch

Hummm... faltou um comentário, voce é o CARA !
:D
????????????????????

bubulindo


Hummm... faltou um comentário, voce é o CARA !
:D


LOL
This... is a hobby.

Go Up