You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino调用toInt()转换二进制字符串输出异常求助

问题根源

String.toInt()默认将字符串内容按十进制数规则解析,不会识别为二进制数值。你拼接得到的字符串是"00111111",toInt()会尝试把它解析为十进制的111111。
Arduino常用的AVR架构中int是16位有符号类型,取值范围仅为-32768~32767,111111远超该范围发生整数溢出,最终输出异常值-19961,和你预期的二进制转十进制结果完全无关。

修复方案

不需要先拼接二进制字符串再转换,直接遍历位数组按位计算效率最高,也不会出现解析规则不匹配、溢出的问题:

const int button = 13;
int buttonPressed = 0;
int counter = 0;
int myInts[] = {0, 0, 1, 1, 1, 1, 1, 1};


void setup()
{
  Serial.begin(9600);
  pinMode(button, INPUT);
}

void loop()
{
  buttonPressed = digitalRead(button); 
  if (buttonPressed == HIGH){
    counter = count();
    Serial.println(counter);
  }
  else{
    Serial.println("Button not pressed");
  }
  delay(1000);
}

int count()
{
  int result = 0;
  // 遍历8位二进制数,按位计算十进制值
  for(int i = 0; i < 8; i++){
    result = (result << 1) + myInts[i];
  }
  Serial.print("二进制串对应十进制值:");
  Serial.println(result); // 这里会正确输出63
  return result;
}

如果你必须要从二进制格式的字符串转数值,可以用strtoul函数指定基数为2做解析,参考写法:

String binStr = "00111111";
long myNumber = strtoul(binStr.c_str(), NULL, 2);
Serial.println(myNumber); // 输出63

注意这里要用long类型接收结果,避免16位int溢出问题。

内容的提问来源于stack exchange,提问作者Stratidemic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:09:16