zoukankan      html  css  js  c++  java
  • [Arduino] 在串口读取多个字符串,并且转换为数字数组

    功能如题目。
    在串口收到逗号分割的6串数字比如
    100,200,45,4,87,99
    然后在6个PWM端口3, 5, 6, 9, 10, 11输出对应PWM值
    代码注释很详细了,就不再说明了。

     

    //定义一个comdata字符串变量,赋初值为空值
        String comdata = "";
        //numdata是分拆之后的数字数组
        int numdata[6] = {0}, PWMPin[6] = {3, 5, 6, 9, 10, 11}, mark = 0;
        void setup()
        {
        //定义0~6脚是输出
          for(int i = 0; i < 6; i++) pinMode(PWMPin[i], OUTPUT);
          Serial.begin(9600);
        }
         
        void loop()
        {
        //j是分拆之后数字数组的位置记数
          int j = 0;
         
          //不断循环检测串口缓存,一个个读入字符串,
          while (Serial.available() > 0)
          {
          //读入之后将字符串,串接到comdata上面。
            comdata += char(Serial.read());
              //延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
            delay(2);
            //标记串口读过数据,如果没有数据的话,直接不执行这个while了。
            mark = 1;
          }
         
          if(mark == 1)  //如果接收到数据则执行comdata分析操作,否则什么都不做。
          {
          //显示刚才输入的字符串(可选语句)
            Serial.println(comdata);
              //显示刚才输入的字符串长度(可选语句)
            Serial.println(comdata.length());
         
        /*******************下面是重点*******************/
        //以串口读取字符串长度循环,
            for(int i = 0; i < comdata.length() ; i++)
            {
            //逐个分析comdata[i]字符串的文字,如果碰到文字是分隔符(这里选择逗号分割)则将结果数组位置下移一位
            //即比如11,22,33,55开始的11记到numdata[0];碰到逗号就j等于1了,
            //再转换就转换到numdata[1];再碰到逗号就记到numdata[2];以此类推,直到字符串结束
              if(comdata[i] == ',')
              {
                j++;
              }
              else
              {
                 //如果没有逗号的话,就将读到的数字*10加上以前读入的数字,
                 //并且(comdata[i] - '0')就是将字符'0'的ASCII码转换成数字0(下面不再叙述此问题,直接视作数字0)。
                 //比如输入数字是12345,有5次没有碰到逗号的机会,就会执行5次此语句。
                 //因为左边的数字先获取到,并且numdata[0]等于0,
                 //所以第一次循环是numdata[0] = 0*10+1 = 1
                 //第二次numdata[0]等于1,循环是numdata[0] = 1*10+2 = 12
                 //第三次是numdata[0]等于12,循环是numdata[0] = 12*10+3 = 123
                 //第四次是numdata[0]等于123,循环是numdata[0] = 123*10+4 = 1234
                 //如此类推,字符串将被变成数字0。
                numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
              }
            }
            //comdata的字符串已经全部转换到numdata了,清空comdata以便下一次使用,
            //如果不请空的话,本次结果极有可能干扰下一次。
            comdata = String("");
         
         
            //循环输出numdata的内容,并且写到PWM引脚
            for(int i = 0; i < 6; i++)
            {
              Serial.print("Pin ");
              Serial.print(PWMPin[i]);
              Serial.print(" = ");
              Serial.println(numdata[i]);
              analogWrite(PWMPin[i], numdata[i]);
              numdata[i] = 0;
            }
            //输出之后必须将读到数据的mark置0,不置0下次循环就不能使用了。
            mark = 0;
          }
        }

    --------------------------------------

    欢迎您,进入 我系程序猿 的cnBlog博客。

    你不能改变你的过去,但你可以让你的未来变得更美好。一旦时间浪费了,生命就浪费了。

    You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.

    --------------------------------------

    分享到QQ空间  

  • 相关阅读:
    元类,单例模式
    面向对象高阶
    类的三大特性---封装以及Property特性
    c# 中的string(神奇的string)
    c#中的equal和getHashCode
    linq中的Distinct的使用(附带IComparable和IComparer的复习和使用)
    flex布局完整示例
    flex布局中flex-basis的理解
    CSS两端对齐的效果;
    理解c#中扩展性代码
  • 原文地址:https://www.cnblogs.com/jqmtony/p/3764846.html
Copyright © 2011-2022 走看看