在Arduino中使用dtostrf格式化输出的一些疑惑

1 事件的起因

在Arduino中,想模拟一个随机定时输出的随机内容,但是输出的内容前一部分要求有一个固定的节点号码,然后后面跟着几个随机的数字。
大约的输出格式是这样的:

节点号码 X坐标值 Y坐标值 Z坐标值 电压值

上面的信息中间使用空格间隔,对于节点号码,要是一个三位的整数,如果达不到三位,前面用0进行补齐,这个是在通电时候完成的,在之后的过程中,这个值不变化;对于后面的坐标值,小数点保留三位,前面加上正负号;电压值这里不进行表述了,示例如下:

001 -3.142 +0.040 -3.943 240v

2 网上的解决方案

网上找到有一个函数能够进行将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);

3 遇到的问题

现在下面写一下没有出错的代码,但是这个代码是不能满足我的使用的:

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
    ......

还显示过其他的结果,这个是怎么回事呢?

4 对于Arduino的疑惑

我是用的是Arduino软件的1.8.7版本,硬件使用的是Arduino NUO,这个是我的使用方法那里出现问题了么?
如果大家知道原因的话,希望给我留言。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值