1.描述
我们需要将字符串转换为数字,也许是因为通讯链路收到了字符串形式的值,而我们需要把它当做一个整数或者浮点数来用。
2.示例
这个代码片段在遇到任何一个不是数字的字符时(或者缓冲区已满)结束数字输入。要让这个功能起作用,我们需要打开串口监视器的换行选项或者输入一些其他的终止字符。
char strval[6]; //定义数组(必须大到足够保存全部数字)
int index = 0; //存储所接收的数字的数组索引
void setup()
{
Serial.begin(9600);
}
void loop()
{
if(Serial.available()>0)
{
char ch = Serial.read();
if(index 5 && isDigit(ch))
{
strval[index++] = ch; //在字符串里加上ASCII字符
}
else
{
//当缓冲区满或遇到第一个非数字
strval[index] = 0; //以 0 终止字符串
int val = atoi(strval); //使用atoi将字符串转换为int
index = 0;
Serial.println(val); //串口打印转换过后的值
}
}
}
3.说明
名称晦涩的atoi(ASCII码到int)和atol(ASCII码到long)函数将字符串转换成整数或者长整数,想要使用它们,必须先要接收并且将整个字符串存储到字符数组,然后才能调用转换函数。上面示例代码创建了名为strval,可容纳多达5位数的字符数组(声明为strval[6],但要为终止空字符留位置),我们用来自Serial.read的数字填充这个数组,直到它遇到不是有效数字的第一个字符。遇到空字符会结束该数组,并且调用atoi函数将字符数组转换成变量val。
此外还有一种方法将String转换成整数:toInt
String number = "1234";
int val = number.toInt();
Arduino 1.0版本添加了parseInt方法,该方法可用于从串口和以太网得到整数值。下面代码片段将数字位组成的序列转换为数字。
if(Serial.available()>0)
{
val = Serial.parseInt();
}
如果数据在规定的时间间隔内没有到达,像parseInt函数这样的流分析方法使用超时将控制返交回给你的程序,默认的超时时间为1s,但是可以通过调用setTimeout方法来改变:
Serial.setTimeout(1000 * 60); //等待一分钟
4.实验现象
没有实验硬件的同学可以到下面的小程序购买哟~