如何在Arduino上将int转换为字符串?

use*_*659 83 arduino

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

这是我到目前为止:

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++;
}
Run Code Online (Sandbox Code Playgroud)

Cas*_*sio 119

使用这样:

String myString = String(n);
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到更多示例.

  • 您不需要使用String对象,Serial.print或println已经转换它们! (2认同)

小智 22

使用itoa()包含在中的功能stdlib.h

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


Mat*_*och 20

你可以简单地做:

Serial.println(n);
Run Code Online (Sandbox Code Playgroud)

它将自动转换n为ASCII字符串.请参阅文档Serial.println().


Ped*_*roD 13

你只需要将它包装在String对象中,如下所示:

String numberString = String(n);
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

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
Run Code Online (Sandbox Code Playgroud)


小智 9

这是用于将int(带符号的16位整数)转换为字符串的速度优化解决方案.

这种实现避免了使用除法,因为用于Arduino的8位AVR没有硬件DIV指令,编译器将除法转换为耗时的重复减法.因此,最快的解决方案是使用条件分支来构建字符串.

从RAM开始准备的固定7字节缓冲区,以避免动态分配.由于它只有7个字节,因此固定RAM使用的成本被认为是最低的.为了帮助编译器,我们将register修饰符添加到变量声明中以加速执行.

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() {}
Run Code Online (Sandbox Code Playgroud)

使用与Arduino v1.0.5捆绑的avr-gcc将此草图编译为1,082字节的代码(int2str函数本身的大小为594字节).与使用编译为2,398字节的String对象的解决方案相比,此实现可以将代码大小减少1.2 Kb(假设您不需要其他String的对象方法,并且您的数字对于signed int类型是严格的).

通过在适当的汇编程序代码中编写,可以进一步优化此函数.

  • 避免 DIV 的另一种方法是乘以 (2^N/10),然后右移 N 位。因此,对于 N=16,x/10 ~= (x*6554)&gt;&gt;16。无论如何,对于大多数数字来说已经足够接近了。 (2认同)