Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Arduino上将int转换为字符串?_Arduino - Fatal编程技术网

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

如何在Arduino上将int转换为字符串?,arduino,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,

如何将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++;
}
这样使用:

String myString = String(n);
String numberString = String(n);
您可以找到更多示例。

您只需执行以下操作:

Serial.println(n);

它将自动将
n
转换为ASCII字符串。请参阅。

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

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

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

char\u int2str[7];
char*int2str(寄存器inti){
寄存器无符号字符L=1;
寄存器字符c;
寄存器布尔m=false;
寄存器char b;//i的低位字节
//否定的
if(i<0){
_int2str[0]='-';
i=-i;
}
否则L=0;
//万
如果(i>9999){
c=i<20000?1
:i<30000?2
: 3;
_int2str[L++]=c+48;
i-=c*10000;
m=真;
}
//千
如果(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=真;
}
如果(m)_int2str[L++]='0';
//数百
如果(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=真;
}
如果(m)_int2str[L++]='0';
//十年(检查低位字节以优化代码)
b=字符(i);
如果(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=真;
}
如果(m)_int2str[L++]='0';
//最后一位
_int2str[L++]=b+48;
//零终止符
_int2str[L]=0;
返回_int2str;
}
//用法示例:
int i=-12345;
char*s;
无效设置(){
s=int2str(i);
}
void loop(){}
此草图使用与Arduino v1.0.5捆绑的avr gcc编译为1082字节的代码(int2str函数本身的大小为594字节)。与使用字符串对象(编译为2398字节)的解决方案相比,此实现可以将代码大小减少1.2kb(假设您不需要其他字符串的对象方法,并且您的数字严格限制为有符号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;
}
char*i2str(inti,char*buf){
字节l=0;
如果(i0;div/=10){
mod=i%div;
i/=div;
如果(!leadingZ | | i!=0){
leadingZ=false;
buf[l++]=i++'0';
}
i=mod;
}
buf[l]=0;
返回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 myString = String(n);
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

下面是一个自编的myitoa(),它的代码要小得多,并且在char*mystring中保留了一个固定的数组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;
}
void myitoa(整数,字符*mystring){
布尔负=数字>0;
mystring[0]=数字0)mystring[n]=数字%10+48;
数目/=10;
}  
mystring[6]=0;
}
更多信息,请访问arduino网站

希望这对你有帮助。
谢谢

这对我来说很管用:

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

@Pubby“printf()使可执行对象大约1000字节,因此如果大小有问题,您可能不想使用它。”相关(不是重复):避免DIV的另一种方法是乘以(2^N/10),然后右移N位。对于N=16,x/10~=(x*6554)>>16。无论如何,对大多数数字来说都足够近了。这是。。。艺术。您不需要使用字符串对象,Serial.print或println已将其转换!我正在寻找如何将97转换为“a”字符或将65转换为“a”字符的方法。我的意思是ASCII数字到字符。我发现这种方法不起作用。@okierinaldi:你可以使用-charbar=97;它会起作用的。