Questão:
Como posso converter Arduino String em tipo de string C?
diegoaguilar
2014-04-24 12:26:04 UTC
view on stackexchange narkive permalink

Eu obtive uma String que, pelo que entendi, é um objeto Arduino, e alguns códigos C ++:

  #include <Wire.h> #include <LiquidCrystal_I2C.h> # incluem <string.h>LiquidCrystal_I2C lcd (0x20,16,2); boolean borrar = false; String IP; void setup () {lcd.init (); lcd.backlight (); pinMode (13, OUTPUT); Serial.begin (9600); Serial1.begin (9600);} void loop () {while (Serial1.available ()) {caractere caracter = Serial1.read (); // Comprobamos el caracter switch (caracter) {default: if (borrar) {IP = ""; lcd.clear (); } lcd.print (caracter); atraso (125); borrar = falso; IP.concat (caracter); quebrar; case '\ r': case 0x0F: case 0x0A: String res = ""; borrar = verdadeiro; int num = atoi (IP.c_str ()); if (num < 127) res = "Classe A"; if (num == 127) res = "Direcção reservada"; if (num > 127 && num < 192) res = "Clase B"; if (num > = 192 && num < 224) res = "Clase C"; if (num > = 224 && num < 240) res = "Clase D"; if (num > = 240 && num < 255) res = "Clase E"; quebrar; } // fin switch} // serial disponible} // fin programa  

No entanto, isso não compilará por causa desta linha:

  int num = atoi (IP.c_str ())  

Como IP é um String e tal método funciona para string . Como posso torná-lo compatível (convertê-lo)?

Trzy respostas:
rmi
2014-04-24 13:30:58 UTC
view on stackexchange narkive permalink

Try

  unsigned char z [100]; IP.getBytes (z, 100); z [IP.length ()] = 0; int n = atoi (z);  

Para recuperar bytes dentro da string. Isso pressupõe que o comprimento da string IP é menor que 100.

Eu tentei e obtive: `BluetoothLCD.cpp: 51: 35: erro: conversão inválida de 'char *' para 'unsigned char *' BluetoothLCD.cpp: 51: 35: erro: inicializando o argumento 1 de 'void String :: getBytes ( unsigned char *, unsigned int, unsigned int) const'`
Eu atualizei `char` para` unsigned char`
Algo estranho está acontecendo, agora obtenho: `BluetoothLCD.cpp: 53: 33: erro: conversão inválida de 'unsigned char *' para 'const char *' BluetoothLCD.cpp: 53: 33: erro: inicializando o argumento 1 de ' int atoi (const char *) '`
Se não houver suporte, `IP.toCharArray (z, 100);` pode ser usado.
Como seria o código?
Deus, eu acho que está feito AGORA
Peter Bloomfield
2014-04-24 13:32:23 UTC
view on stackexchange narkive permalink

Tente atualizar para a versão mais recente das bibliotecas / IDE do Arduino.

O método c_str () foi introduzido na classe Arduino String recentemente, acredito. Essa linha de código certamente funciona bem para mim no Arduino IDE 1.0.5.

Estou usando o IDE do Linux, como faria isso?
@diegoaguilar - Acho que você teria que atualizar manualmente suas bibliotecas centrais do Arduino. Você pode obtê-los no GitHub: https://github.com/arduino/Arduino
A versão 1.0.5 tem c_str () que pode ser baixado para linux no site oficial do Arduino: http://arduino.cc/en/Main/Software
jfpoilpret
2014-04-25 10:12:10 UTC
view on stackexchange narkive permalink

Seu código poderia ser melhorado removendo o uso da string IP completamente e calculando diretamente seu valor numérico enquanto os caracteres chegam por meio de Serial1 :

  ... boolean borrar = false; int IP = 0; ... void loop () {while (Serial1.available ()) {char caracter = Serial1.read (); // Comprobamos el caracter switch (caracter) {// NOTA é melhor substituir o padrão pela lista de todos os dígitos ... case '0': case '1': case '2': case '3': case ' 4 ': case' 5 ': case' 6 ': case' 7 ': case' 8 ': case' 9 ': if (borrar) {IP = 0; lcd.clear (); } lcd.print (caracter); atraso (125); borrar = falso; IP * = 10; IP + = (int) (caracter - '0'); quebrar; case '\ r': case 0x0F: case 0x0A: String res = ""; borrar = verdadeiro; int num = IP; if (num < 127) res = "Classe A"; if (num == 127) res = "Direcção reservada"; if (num > 127 && num < 192) res = "Clase B"; if (num > = 192 && num < 224) res = "Clase C"; if (num > = 224 && num < 240) res = "Clase D"; if (num > = 240 && num < 255) res = "Clase E"; quebrar; } // fin switch} // serial disponible} // fin programa  

Desta forma, traria 2 vantagens:

  1. um pouco mais rápido do que trabalhar com String
  2. nenhuma alocação / desalocação de memória dinâmica ( String faz muito disso), o que pode levar seu programa a fragmentação de heap e, eventualmente, travar.

Observe que não refatorei mais o seu código, pois imaginei que fosse apenas um snippet, não o código completo do seu programa. Caso contrário, eu teria realizado um refinamento adicional como:

  • remover a variável num , pois agora é o mesmo que IP
  • substitua res de String por const char * (para reduzir ainda mais a fragmentação do heap devido ao uso de String )


Estas perguntas e respostas foram traduzidas automaticamente do idioma inglês.O conteúdo original está disponível em stackexchange, que agradecemos pela licença cc by-sa 3.0 sob a qual é distribuído.
Loading...