在Arduino中,想模拟一个随机定时输出的随机内容,但是输出的内容前一部分要求有一个固定的节点号码,然后后面跟着几个随机的数字。
大约的输出格式是这样的:
节点号码 X坐标值 Y坐标值 Z坐标值 电压值
上面的信息中间使用空格间隔,对于节点号码,要是一个三位的整数,如果达不到三位,前面用0进行补齐,这个是在通电时候完成的,在之后的过程中,这个值不变化;对于后面的坐标值,小数点保留三位,前面加上正负号;电压值这里不进行表述了,示例如下:
001 -3.142 +0.040 -3.943 240v
网上找到有一个函数能够进行将double类型格式化转换成字符串进行输出,函数原型如下:
// 参考的博客地址:https://blog.csdn.net/qq_25827845/article/details/50717522
// _val:要转换的float或者double值
// _width:转换后整数部分长度
// _prec:转换后小数部分长度
// _s:保存到该char数组中
char* dtostrf(double _val,signed char _width, unsigned char prec, char* _s)
并且附带有如下的示例代码:
float f=3.1415;
char c[];
dtostrf(f,1,2,c);
Serial.println(c);
现在下面写一下没有出错的代码,但是这个代码是不能满足我的使用的:
long i = 1;
char i_str[] = "";
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Test msg:");
randomSeed(analogRead(0));
i = random(1,100);
Serial.print("i = ");
Serial.print(i);
dtostrf(i,3,0,i_str);
Serial.print(" i_str = ");
Serial.println(i_str);
}
void loop() {
// put your main code here, to run repeatedly:
}
输出的结果是:
Test msg:
i = 60 i_str = 60
感觉貌似是正确的,对么,再看如下的小小的修改,将上面的输出i的值和格式转换代码的行顺序改变一下:
i = random(1,100);
dtostrf(i,3,0,i_str);
Serial.print("i = ");
Serial.print(i);
Serial.print(" i_str = ");
Serial.println(i_str);
对于上面的程序,则执行的有时候正确,也有时候错误,总之,错误的时候是显示i的值变化了,但是i_str的值却是正确的,给我的感觉就是这个函数好像改变了原始的输入的值。但是在程序执行的过程中,却不一定出错,但是出错的概率很大。
还有下面的代码测试:
long i = 1;
char i_str[] = "";
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Test msg:");
randomSeed(analogRead(0));
i = random(1,100);
dtostrf(i,3,0,i_str);
Serial.print("i = ");
Serial.print(i);
Serial.print(" i_str = ");
Serial.println(i_str);
}
void loop() {
// put your main code here, to run repeatedly:
dtostrf(i,3,0,i_str);
Serial.print("i = ");
Serial.print(i);
Serial.print(" i_str = ");
Serial.println(i_str);
}
有一次输出的结果如下:
Test msg:
i = 30 i_str = 30
i = 30 i_str = 30
i = 30 i_str = 40
i = 30 i_str = C0
i = 30 i_str = C0
i = 30 i_str = C0
i = 30 i_str = C0
i = 30 i_str = C0
i = 30 i_str = C0
i = 30 i_str = C0
i = 30 i_str = C0
i = 30 i_str = C0
i = 30 i_str = D0
i = 30 i_str = C0
......
还显示过其他的结果,这个是怎么回事呢?
我是用的是Arduino软件的1.8.7版本,硬件使用的是Arduino NUO,这个是我的使用方法那里出现问题了么?
如果大家知道原因的话,希望给我留言。