请问Arduino在输出完一个数组之后想换行怎么处理?-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5248|回复: 6

[未解决] 请问Arduino在输出完一个数组之后想换行怎么处理?

[复制链接]
发表于 2021-1-25 21:25 | 显示全部楼层 |阅读模式
小白现在在学习Arduino的串口,想在串口监视器给它发一个字符串,然后它再把那个字符串发回电脑,希望每发回一个字符串后换行一次。但是现在很奇怪。
情况一:
j=i;//i是之前记录了字符串长度的一个计数值
while(i>0)
{
Serial.print(in[j-i]);//in[]是接收了串口信息的数组
i--;
}

这样子写之后,就是输出总是在一行,没实现换行

情况二:
j=i;//i是之前记录了字符串长度的一个计数值
while(i>0)
{
Serial.print(in[j-i]);//in[]是接收了串口信息的数组
i--;
}
if(j>0)
{
Serial.print("\n");
j=0;
}


这样子它会每输出一个字符就换一次行,有点搞不懂为什么额。

顺便一问,arduino的void loop()函数里面应该是顺序执行的吧。

求大佬们帮忙看看是什么地方出了问题,谢谢。

发表于 2021-1-25 22:10 | 显示全部楼层
Serial.println();
 楼主| 发表于 2021-1-25 22:34 | 显示全部楼层

额,这个用完也是每个字符之后都换行了,就很好奇 print和println这两个函数的原理。
发表于 2021-1-25 23:38 | 显示全部楼层
liangrubincn 发表于 2021-1-25 22:34
额,这个用完也是每个字符之后都换行了,就很好奇 print和println这两个函数的原理。 ...

应该直接打印in,Serial.println(in);
 楼主| 发表于 2021-1-26 12:44 | 显示全部楼层
sangshu 发表于 2021-1-25 23:38
应该直接打印in,Serial.println(in);

这样之后也是一个字符换一次行哦
 楼主| 发表于 2021-1-26 13:16 | 显示全部楼层
liangrubincn 发表于 2021-1-26 12:44
这样之后也是一个字符换一次行哦

唉,好奇怪啊,看不出来哪里不对劲。。。感觉按照逻辑楼上两位还有我自己尝试的办法都应该是每个字符串只换行一次才对的,结果在监视器上都是每个字符换了个行
 楼主| 发表于 2021-1-26 13:38 | 显示全部楼层
liangrubincn 发表于 2021-1-26 13:16
唉,好奇怪啊,看不出来哪里不对劲。。。感觉按照逻辑楼上两位还有我自己尝试的办法都应该是每个字符串只 ...

呀呀呀,破案了
其实输出的这部分是没有问题的,怎么写都对,问题出在了读取串口数据的部分。
  while(Serial.available()>0)
  {
    in=Serial.read();
    i++;
    Serial.print(i);
    delay(2);
  }

读取串口发来的数据时,先利用Serial.available()函数判断缓冲区有无数据,然后用Serial.read()读取一个字节,读字符串的话要通过循环读取。问题就出在了这里。
缓冲区中重新填入下一个字节需要时间,如果刚刚读出一个字节就用available()函数的话,它的返回值就是0,没有发现数据,所以就什么都没读出来循环结束,在下一圈loop时才读到第二个字节。这种情况下如果输出时不换行,看起来板子它就是发送了原来的字符串,而如果加换行,它就是每个字节换个行,因为一个loop里只读到了一个字节。
解决办法就是在那个读数据的循环里加一个短短的延时,自己之前没想到会有这种情况就没有写那句delay(2);结果产生了这个问题,可蠢死我了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 13:31 , Processed in 0.072117 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表