Pages: [1]   Go Down
Author Topic: CONVERSÃO  (Read 1118 times)
0 Members and 1 Guest are viewing this topic.
Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 383
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

????????????????????

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3299
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 383
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

OK, obrigado pelo caminho das pedras!
 smiley
Logged

????????????????????

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 383
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
« Last Edit: June 28, 2012, 07:21:02 pm by Kotch » Logged

????????????????????

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3299
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:

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!!!!!
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 383
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

 smiley-cool
Logged

????????????????????

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 383
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hummm... faltou um comentário, voce é o CARA !
 smiley-grin
Logged

????????????????????

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3299
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hummm... faltou um comentário, voce é o CARA !
 smiley-grin

LOL
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Pages: [1]   Go Up
Jump to: