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
相关产品推荐
相关产品推荐

