如何将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++;
}
答案 0 :(得分:113)
答案 1 :(得分:21)
使用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)
答案 2 :(得分:20)
答案 3 :(得分:13)
你只需要将它包装在这样的String对象中:
String numberString = String(n);
你也可以这样做:
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
答案 4 :(得分: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() {}
使用与Arduino v1.0.5捆绑的avr-gcc将此草图编译为1,082字节的代码(int2str函数本身的大小为594字节)。与使用编译为2,398字节的String对象的解决方案相比,此实现可以将代码大小减少1.2 Kb(假设您不需要其他String的对象方法,并且您的数字对于signed int类型是严格的。)
通过在适当的汇编代码中编写,可以进一步优化该函数。
答案 5 :(得分:1)
解决方案太大了。试试这个简单的。请提供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'并直接递增缓冲区,可以很容易地修改以返回缓冲区的结尾。
答案 6 :(得分:0)
下面是一个自组合的myitoa(),它在代码中要小得多,并且在char * mystring中保留一个7的FIXED数组(包括终止0),这通常是可取的。很明显,如果需要一个可变长度的输出字符串,可以使用字符移位来构建代码。
.tab .dropdown-menu {
top: 50px;
}
答案 7 :(得分:0)
Serial.println(val)
Serial.println(val, format)
有关更多信息,您可以访问arduino网站 https://www.arduino.cc/en/Serial/Println
希望这对您有帮助。 谢谢!
答案 8 :(得分:0)
这对我来说很简单:
int bpm = 60;
char text[256];
sprintf(text, "Pulso: %d ", bpm);
//now use text as string
答案 9 :(得分:-1)
在第一个例子中,使用了经典的C字符串:它只是一个以零(NUL字符)结尾的字符数组。 其他示例使用String类,这是一个C ++类,除了玩具示例和小型演示之外,我将远离它。它以不易预测的方式泄漏内存,并导致电路板的神秘锁定。