I got a String
which as I understand is an Arduino object, and got some C++ code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <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()) {
char caracter = Serial1.read(); //Comprobamos el caracter
switch(caracter) {
default:
if (borrar) {
IP = "";
lcd.clear();
}
lcd.print(caracter);
delay(125);
borrar = false;
IP.concat(caracter);
break;
case '\r':
case 0x0F:
case 0x0A:
String res = "";
borrar = true;
int num= atoi(IP.c_str());
if (num < 127)
res="Clase A";
if (num == 127)
res="Direccion 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 ";
break;
} //fin switch
}//serial disponible
}//fin programa
However, this won't compile because of this line:
int num= atoi(IP.c_str())
As IP is a String
and such method works for string
. How can I make it compatible (convert it)?
3 Answers 3
Your code could be improved by removing the use of IP
string altogether, and directly calculating its numeric value while characters come in through Serial1
:
...
boolean borrar = false;
int IP = 0;
...
void loop() {
while (Serial1.available()) {
char caracter = Serial1.read(); //Comprobamos el caracter
switch(caracter) {
// NOTE it is better to replace default by the list of all digits...
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);
delay(125);
borrar = false;
IP *= 10;
IP += (int) (caracter - '0');
break;
case '\r':
case 0x0F:
case 0x0A:
String res = "";
borrar = true;
int num= IP;
if (num < 127)
res="Clase A";
if (num == 127)
res="Direccion 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 ";
break;
} //fin switch
}//serial disponible
}//fin programa
This way would bring you 2 advantages:
- a bit faster than working with
String
- no dynamic memory allocation/deallocation (
String
does a lot of these) which might lead your program to heap fragmentation and eventually crash.
Note that I have not further refactored your code as I guessed it was just a snippet, not the complete code for your program. Otherwise, I would have performed further refinement like:
- remove
num
variable since it is the same asIP
now - replace
res
fromString
toconst char*
(to further reduce heap fragmentation due toString
usage)
Try
unsigned char z[100];
IP.getBytes(z, 100);
z[IP.length()] = 0;
int n = atoi(z);
To retrieve bytes inside the string. This assumes IP string's length is shorter than 100.
-
I tried and got:
BluetoothLCD.cpp:51:35: error: invalid conversion from ‘char*’ to ‘unsigned char*’ BluetoothLCD.cpp:51:35: error: initializing argument 1 of ‘void String::getBytes(unsigned char*, unsigned int, unsigned int) const’
diegoaguilar– diegoaguilar2014年04月24日 08:42:08 +00:00Commented Apr 24, 2014 at 8:42 -
I have updated
char
tounsigned char
rmi– rmi2014年04月24日 08:44:38 +00:00Commented Apr 24, 2014 at 8:44 -
Something weird is going on, now I obtain:
BluetoothLCD.cpp:53:33: error: invalid conversion from ‘unsigned char*’ to ‘const char*’ BluetoothLCD.cpp:53:33: error: initializing argument 1 of ‘int atoi(const char*)’
diegoaguilar– diegoaguilar2014年04月24日 08:45:52 +00:00Commented Apr 24, 2014 at 8:45 -
If it does not support,
IP.toCharArray(z, 100);
may be used.rmi– rmi2014年04月24日 08:46:42 +00:00Commented Apr 24, 2014 at 8:46 -
How would code look like?diegoaguilar– diegoaguilar2014年04月24日 08:49:01 +00:00Commented Apr 24, 2014 at 8:49
Try updating to the latest version of the Arduino libraries/IDE.
The c_str()
method was introduced to the Arduino String class quite recently, I believe. That line of code certainly works fine for me on Arduino IDE 1.0.5.
-
I'm using Linux IDE how would I do it?diegoaguilar– diegoaguilar2014年04月24日 08:39:45 +00:00Commented Apr 24, 2014 at 8:39
-
1@diegoaguilar - I think you'd have to manually update your Arduino core libraries. You can get them from GitHub: github.com/arduino/ArduinoPeter Bloomfield– Peter Bloomfield2014年04月24日 08:52:53 +00:00Commented Apr 24, 2014 at 8:52
-
2Version 1.0.5 has c_str() it can be downloaded for linux from the official Arduino site: arduino.cc/en/Main/SoftwareCraig– Craig2014年04月24日 17:16:10 +00:00Commented Apr 24, 2014 at 17:16