如何在 Arduino 上将 int 转换为 string?

如何将 int (n)转换为字符串,以便当我通过序列发送它时,它被作为字符串发送?

This is what I have so far:

int ledPin=13;
int testerPin=8;
int n=1;


char buf[10];


void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(testerPin, OUTPUT);
Serial.begin(115200);
}


void loop()
{
digitalWrite(ledPin, HIGH);
sprintf(buf, "Hello!%d", n);
Serial.println(buf);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);


n++;
}
592571 次浏览

使用方法如下:

String myString = String(n);

你可以找到更多的例子 给你

你可以简单地做:

Serial.println(n);

它会自动将 n转换为 ASCII 字符串。

这是将 int (有符号16位整数)转换为 string 的速度优化解决方案。

This implementation avoids using division since 8-bit AVR used for Arduino has no hardware DIV instruction, the compiler translate division into time-consuming repetitive subtractions. Thus the fastest solution is using conditional branches to build the string.

一个固定的7字节缓冲区准备从开始在 RAM,以避免动态分配。因为它只有7个字节,所以固定 RAM 使用的成本被认为是最小的。为了帮助编译器,我们在变量声明中添加寄存器修饰符以加快执行速度。

char _int2str[7];
char* int2str( register int i ) {
register unsigned char L = 1;
register char c;
register boolean m = false;
register char b;  // lower-byte of i
// negative
if ( i < 0 ) {
_int2str[ 0 ] = '-';
i = -i;
}
else L = 0;
// ten-thousands
if( i > 9999 ) {
c = i < 20000 ? 1
: i < 30000 ? 2
: 3;
_int2str[ L++ ] = c + 48;
i -= c * 10000;
m = true;
}
// thousands
if( i > 999 ) {
c = i < 5000
? ( i < 3000
? ( i < 2000 ? 1 : 2 )
:   i < 4000 ? 3 : 4
)
: i < 8000
? ( i < 6000
? 5
: i < 7000 ? 6 : 7
)
: i < 9000 ? 8 : 9;
_int2str[ L++ ] = c + 48;
i -= c * 1000;
m = true;
}
else if( m ) _int2str[ L++ ] = '0';
// hundreds
if( i > 99 ) {
c = i < 500
? ( i < 300
? ( i < 200 ? 1 : 2 )
:   i < 400 ? 3 : 4
)
: i < 800
? ( i < 600
? 5
: i < 700 ? 6 : 7
)
: i < 900 ? 8 : 9;
_int2str[ L++ ] = c + 48;
i -= c * 100;
m = true;
}
else if( m ) _int2str[ L++ ] = '0';
// decades (check on lower byte to optimize code)
b = char( i );
if( b > 9 ) {
c = b < 50
? ( b < 30
? ( b < 20 ? 1 : 2 )
:   b < 40 ? 3 : 4
)
: b < 80
? ( i < 60
? 5
: i < 70 ? 6 : 7
)
: i < 90 ? 8 : 9;
_int2str[ L++ ] = c + 48;
b -= c * 10;
m = true;
}
else if( m ) _int2str[ L++ ] = '0';
// last digit
_int2str[ L++ ] = b + 48;
// null terminator
_int2str[ L ] = 0;
return _int2str;
}


// Usage example:
int i = -12345;
char* s;
void setup() {
s = int2str( i );
}
void loop() {}

这个示意图使用 avr-gcc 编译成1.082字节的代码,该代码与 Arduino v1.0.5捆绑在一起(int2str 函数本身的大小为594字节)。与使用编译成2,398字节的 String 对象的解决方案相比,这个实现可以将代码大小减少1.2 Kb (假设您不需要其他 String 的对象方法,并且您的数字严格为带符号的 int 类型)。

这个函数可以通过编写适当的汇编代码来进一步优化。

这个解决方案太大了。试试这个简单的。请提供一个7 + 字符缓冲区,没有检查。

char *i2str(int i, char *buf){
byte l=0;
if(i<0) buf[l++]='-';
boolean leadingZ=true;
for(int div=10000, mod=0; div>0; div/=10){
mod=i%div;
i/=div;
if(!leadingZ || i!=0){
leadingZ=false;
buf[l++]=i+'0';
}
i=mod;
}
buf[l]=0;
return buf;
}

如果您丢弃索引‘ l’并直接增加缓冲区,可以很容易地修改为返回缓冲区的后端。

使用包含在 stdlib.h中的 itoa()函数

char buffer[7];         //the ASCII of the integer will be stored in this char array
itoa(-31596,buffer,10); //(integer, yourBuffer, base)

你只需要像下面这样将它包装成一个 String 对象:

String numberString = String(n);

You can also do:

String stringOne = "Hello String";                     // using a constant String
String stringOne =  String('a');                       // converting a constant char into a String
String stringTwo =  String("This is a string");        // converting a constant string into a String object
String stringOne =  String(stringTwo + " with more");  // concatenating two strings
String stringOne =  String(13);                        // using a constant integer
String stringOne =  String(analogRead(0), DEC);        // using an int and a base
String stringOne =  String(45, HEX);                   // using an int and a base (hexadecimal)
String stringOne =  String(255, BIN);                  // using an int and a base (binary)
String stringOne =  String(millis(), DEC);             // using a long and a base

下面是一个自组装的 myitoa () ,它的代码要小得多,并且在 char * mystring 中保留一个 FIXED 数组7(包括终止0) ,这通常是可取的。显然,如果需要可变长度的输出字符串,可以使用字符移位来构建代码。

void myitoa(int number, char *mystring) {
boolean negative = number>0;


mystring[0] = number<0? '-' : '+';
number = number<0 ? -number : number;
for (int n=5; n>0; n--) {
mystring[n] = ' ';
if(number > 0) mystring[n] = number%10 + 48;
number /= 10;
}
mystring[6]=0;
}
Serial.println(val)
Serial.println(val, format)

想了解更多,可以访问阿尔迪诺的网站 Https://www.arduino.cc/en/serial/println

希望这能帮到你。 谢谢!

这对我来说很有效:

int bpm = 60;
char text[256];
sprintf(text, "Pulso: %d     ", bpm);
//now use text as string