查看: 102|回复: 9

[已解决] 求助!我的n怎么不循环了。

[复制链接]
  • TA的每日心情
    开心
    2020-6-30 08:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2020-6-29 16:25 | 显示全部楼层 |阅读模式
    本帖最后由 baiya 于 2020-6-30 08:14 编辑

    我在串口监视器上输入10,应该会让小灯闪烁10次,但是就只闪烁了一次,串口监视器上只出现n=9。



    1. int n=0;
    2. void setup() {
    3.   // put your setup code here, to run once:
    4. pinMode(13,OUTPUT);
    5. Serial.begin(9600);

    6. }

    7. void loop() {
    8.   // put your main code here, to run repeatedly:
    9. if(Serial.available()>0){
    10.   n=Serial.parseInt();
    11.   }


    12. if(n>0){
    13.   n--;
    14.   digitalWrite(13,HIGH);
    15.   delay(500);
    16.   digitalWrite(13,LOW);
    17.   delay(500);
    18.   Serial.print("n=");
    19.   Serial.println(n);
    20. }
    21. }
    复制代码


  • TA的每日心情
    开心
    2020-7-1 21:46
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2020-6-29 17:32 | 显示全部楼层
    本帖最后由 瞌睡虫2020 于 2020-6-29 17:37 编辑

    Serial.available()这个函数我从没用过

    不过,我猜这个函数是个阻塞函数,如果串口无输入,则阻塞,

    所以你输入10,而loop函数实际只执行一次,所以也就是到n=9就停止了,等待你下一次输入
    你可以试试下面这段代码也许能达到你的想要的效果

    • void loop() {
    • if(n>0){
    •   n--;
    •   digitalWrite(13,HIGH);
    •   delay(500);
    •   digitalWrite(13,LOW);
    •   delay(500);
    •   Serial.print("n=");
    •   Serial.println(n);
    • }else{
    •   // put your main code here, to run repeatedly:
    •   if(Serial.available()>0){
    •      n=Serial.parseInt();
    •   }
    • }
    • }


  • TA的每日心情
    郁闷
    2020-7-3 00:02
  • 签到天数: 132 天

    [LV.7]常住居民III

    发表于 2020-6-29 18:56 | 显示全部楼层
    看到你的求助,我也试了一下,还真是这样。无解,我把led部分注释了,在loop中打印n,发现n接收到数值后在下个loop周期中被置0了!!!这是为什么呢?求解答!

    该用户从未签到

    发表于 2020-6-29 18:56 | 显示全部楼层

    if(n>0),if是判断语句,不是循环语句,改成while (n > 0)

  • TA的每日心情
    郁闷
    2020-7-3 00:02
  • 签到天数: 132 天

    [LV.7]常住居民III

    发表于 2020-6-29 18:58 | 显示全部楼层
    开在边缘 发表于 2020-6-29 18:56
    if(n>0),if是判断语句,不是循环语句,改成while (n > 0)

    loop是循环啊
    如果直接给n赋值可以正确执行

    该用户从未签到

    发表于 2020-6-29 19:19 | 显示全部楼层
    helloword1111 发表于 2020-6-29 18:58
    loop是循环啊
    如果直接给n赋值可以正确执行

    按照这个程序,如果你要依靠loop来循环,那么就要修改串口的读取。

    当你在串口监视器中输入了一个整数,比如10,这时候如果你不按回车,那么这个10是不会发送出去的。当你按下回车后,“10”是发送出去了,但是别忘了,后面还跟了一个“回车”字符。所以程序从串口接收到的完整的内容是“10回车”。

    程序先是使用parseInt,提取整数,那么“10”提取出来了,串口缓冲区里还剩下“回车”。然后loop循环后,串口又一次把“回车”提取出来,但是“回车”字符不是一个整数,所以就转换成了0。这也是为什么loop后n变成0的原因。



  • TA的每日心情
    擦汗
    2019-11-1 21:03
  • 签到天数: 101 天

    [LV.6]常住居民II

    发表于 2020-6-29 20:22 | 显示全部楼层
    原程序复制过来,IDE1.8.8 板子UNO  亲测OK啊。

    10 5 test

    10 5 test

    该用户从未签到

    发表于 2020-6-29 20:33 | 显示全部楼层
    wwwusr 发表于 2020-6-29 20:22
    原程序复制过来,IDE1.8.8 板子UNO  亲测OK啊。

    不同的串口监视器,对于回车后发送数据的处理方式是不一样的

    有的串口监视器会把“回车”做为字符,和数据一起发送出去,这时候程序就会出问题

    有的串口监视器则忽略了“回车”,只是把数据发送出去,那么程序就不会出问题

    所以程序在处理串口读取的时候,一定要考虑到“回车”字符的问题,否则程序在不同环境下会出现不同的结果,俗话就是这个程序的健壮性不高
  • TA的每日心情
    郁闷
    2020-7-3 00:02
  • 签到天数: 132 天

    [LV.7]常住居民III

    发表于 2020-6-29 21:04 | 显示全部楼层
    多谢各位帮助,原来是换行符的原因!!把“换行符”改为“没有结束符”程序终于正常了,谢谢各位了!
  • TA的每日心情
    开心
    2020-6-30 08:20
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-6-30 08:11 | 显示全部楼层
    本帖最后由 baiya 于 2020-6-30 08:16 编辑
    开在边缘 发表于 2020-6-29 20:33
    不同的串口监视器,对于回车后发送数据的处理方式是不一样的

    有的串口监视器会把“回车”做为字符,和数 ...

    谢谢大佬!解决了!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    这个F()函数是做什么的?
    这个F()函数是做什么的
    如图上,在看代码的时候,发现了这么一个函数,然后后面又一行英文注释。 我用有道翻
    隔离论坛在搞一个开源的arduino墨水屏,值得入手吗?
    隔离论坛在搞一个开源的ar
    amobbs论坛出来了一个众筹的arduino的墨水屏终端,100多块钱,有大神加入了吗? 看着
    两轮自平衡小车的线性CCD循迹总结
    两轮自平衡小车的线性CCD
    继之前的两轮自平衡小车的制作总结(https://www.arduino.cn/thread-99011-1-1.html)
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表