当前位置: 首页 > 知识库问答 >
问题:

在Arduino IDE中将255以上的“字符串”转换为精确的“整数”或“长”类型

微生德泽
2023-03-14

谢谢你的时间。

我试图将Arduino IDE的serialEvent()中从串行端口读取的“字符串”转换为具有精确表示的整数值。

例如,如果字符串myString=200,那么int myInt应该是200。

我已经有点成功,但无法将字符串转换为超过255的精确int表示。

我尝试过的解决方案:

1) 用过。Arduino中的toInt()函数。

2) 使用了“atoi”和“atol”函数。

3) 连载。循环()中的parseInt()。

所有这些方法在每255个值之后从0开始重新计数。

我不能使用parseInt,因为它只在循环()内部工作。我的应用程序需要永久存储变量值,直到通过端口给出另一个值。对于这个Arduino由于的闪存已被使用。

存储代码的内存似乎只在SerialEvents()中工作。

代码片段如下所示:

#include <stdlib.h>
#include <DueFlashStorage.h>
DueFlashStorage memory;

String x = " ";
int x_size;
int threshold;

void setup(){
  Serial.begin(115200);
}

void loop{
  Serial.println(memory.read(0));
}

void serialEvent(){

  while(Serial.available()){

    x = Serial.readStringUntil('\n');

    x_size = x.length();
    char a[x_size+1];

    x.toCharArray(a, x_size+1);

    threshold = atoi(a);

    memory.write(0, threshold);
  }
}

共有3个答案

韦棋
2023-03-14

由于Arduino IDE中缺乏用于字符/字符串类型到int类型转换(限制为255)的良好函数,我编写了自己的转换代码,似乎工作得很好。

int finalcount=0;


void setup(){

Serial.begin(115200);
}



void loop(){
   if(Serial.available()) {
    int count = 0;   
    char number[5];         // determine max size of array as 5

    bool wait = true;
    while(wait) {                // stay in this loop until newline is read
      if(Serial.available()) {
        number[count] = Serial.read();

        if (number[count] == '\n') {
          finalcount = count;         //max array size for integer; could be less than 5
          wait = false; // exit while loop
        }


        count++;
      }
    }  

    int val[finalcount];   //array size determined for integer
    int placeValue;         
    int finalval[finalcount];  
    int temp=0;
    int threshold;

    for(int i = 0; i<finalcount; i++){

        val[i] = (int)number[i]-48;        //convert each char to integer separately
        placeValue = pow(10,(finalcount-1)-i);  //calculate place value with a base of 10

        finalval[i] = val[i]*placeValue;      //update integers with their place value

        temp += finalval[i] ;            //add all integers 
        threshold = temp;              //resulting number stored as threshold             
    }

        Serial.println(threshold);     //prints beyond 255 successfully !


  }
}
闾丘朗
2023-03-14

每次只转换1个字符,这就是限制为255的原因。如果您没有做任何其他事情,您可以保持serial.read循环,直到所有字符都被读取。例如:

void loop() {
  if(Serial.available()) {
    byte count = 0;
    char number[10]; // determine max size of array
    bool wait = true;
    while(wait) { // stay in this loop until newline is read
      if(Serial.available()) {
        number[count] = Serial.read();
        if (number[count] == '\n') {
          wait = false; // exit while loop
        }
        count++;
      }
    }  
    int threshold = atoi(number);
    memory.write(0, threshold);
  }
}
罗心思
2023-03-14

1)函数。toInt()返回LONG,你想要INT(我不知道为什么老实说,但它是在留档)...

#include <stdlib.h>

String x = "1000";
int x_ = 0;

void setup() {
  Serial.begin(9600);

}

void loop() {
  x_ = (int) x.toInt();

  Serial.println(x_);
  delay(1000);
}

2)我不专业...但是serilEvents()是一种非常古老的做事方式,不建议使用它。您可以在循环()函数中“手动”完成。

 类似资料:
  • 问题内容: 我试图从返回的字符串转换成。Go中惯用的方式是什么? 问题答案: 例如,

  • 问题内容: 我有一个使用long作为ID的定制类。但是,当我使用ajax调用操作时,我的ID被截断并且丢失了最后2个数字,因为javascript处理大数字时会失去精度。我的解决方案是给我的JavaScript字符串,但是ID必须在服务器端保留很长时间。 有没有一种方法可以将属性序列化为字符串?我在寻找某种属性。 控制者 模型 JSON结果 问题答案: 您可能可以创建一个自定义并将其应用于您的媒体

  • 问题内容: 我正在从在Varchar中具有原始提要的表中导入数据,我需要将varchar中的列导入到字符串列中。我尝试使用以及,但是却遇到了错误,因为有一些空字段,我需要将它们作为空或null检索到新表中。 请让我知道是否有相同的功能。 问题答案: 大胆猜测:如果您的值是一个空字符串,则可以使用NULLIF将其替换为NULL:

  • 如何将字符串值转换为整数,并将转换后的值乘以整数,这样我就可以得到300.00的结果。见下面的例子- 如果我像这样编码,那么我就会出错-

  • 问题内容: 有没有一种方法可以将整数转换为PHP中的字符串? 问题答案: 您可以使用该函数将数字转换为字符串。 从维护的角度来看,它显然是您正在尝试做的事情,而不是其他一些更深奥的答案。当然,这取决于您的上下文。