UerRob 发表于 2015-6-2 17:48:03

arduino串口通信直接输入数值的方法及代码

首先不知道有没有这样的库函数,总之下面的代码是有效的。
有限繁琐,等待大神来瘦身呵呵。


我们知道Serial.read()读出来的是字符的ascii码,这样输入多位字符的时候便成了一个个分离开的单个字符。
我们只需要将这些带个字符按规律乘以10的乘方即可还原成需要的数值了。

这里以回车符 即'\r'为结束标志 可以根据需要修改

UerRob 发表于 2015-6-2 17:48:20

代码转自 uer8.com 大学生电子爱好者哈 分享给大家。char mes,i=0;
int real,zero=0;
int number; //number储存实际输入数值

int change(int);
int pow(int,int);

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


void loop(){
while(Serial.available()>0){
mes=Serial.read();

//该部分代码用于记录末尾0的个数,然后最后添上
if(mes=='0') zero++;
else if(mes!='\r') zero=0;

//若需修改结束标志,可以更改'\r'
if(mes=='\r') {
i=0;
number=change(real);
for(;zero>0;zero--) number=number*10; //该循环用于将末尾丢失的0添上
Serial.println(real);
Serial.println(number); //number中储存实际输入数值,real是反过来的数值可以无视
real=0;
break;
}
real+=(mes-'0')*pow(10,i);
i++;
}

}

int pow(int n,int x){ //自制简易乘方函数,返回n^x。也可以试试调用math.h中的pow()
int val=1;
for(;x>0;x--) val=val*n;
return val;
}

int change(int a){ //读到的数值首末倒过来
int p,real;
int i=0,n=0;
for(p=a;p!=0;n++) p=p/10; //n记录数值的位数
for(;a!=0;i++){
p=a%10; //取余,一次取出个位
real+=p*pow(10,n-i-1);
a=a/10;
}
return real;
}其实还有一个思路可以试试:
将读到的字符按顺序存储到字符数组里,然后一个个取出来乘以10的乘方即可。
这样可以免去将数的头尾倒过来。

不过既然写出来了就懒得改了

suoma 发表于 2015-6-3 16:06:37

            谢谢分享
页: [1]
查看完整版本: arduino串口通信直接输入数值的方法及代码