• Arduino学习笔记A6(补充)


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

    ARDUINO 代码复制打印
     
    1. //定义一个comdata字符串变量,赋初值为空值
    2. String comdata = "";
    3. //numdata是分拆之后的数字数组
    4. int numdata[6] = {0}, PWMPin[6] = {3, 5, 6, 9, 10, 11}, mark = 0;
    5. void setup()
    6. {
    7. //定义0~6脚是输出
    8.   for(int i = 0; i < 6; i++) pinMode(PWMPin[i], OUTPUT);
    9.   Serial.begin(9600);
    10. }
    11.  
    12. void loop()
    13. {
    14. //j是分拆之后数字数组的位置记数
    15.   int j = 0;
    16.  
    17.   //不断循环检测串口缓存,一个个读入字符串,
    18.   while (Serial.available() > 0)
    19.   {
    20.   //读入之后将字符串,串接到comdata上面。
    21.     comdata += char(Serial.read());
    22.       //延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
    23.     delay(2);
    24.     //标记串口读过数据,如果没有数据的话,直接不执行这个while了。
    25.     mark = 1;
    26.   }
    27.  
    28.   if(mark == 1)  //如果接收到数据则执行comdata分析操作,否则什么都不做。
    29.   {
    30.   //显示刚才输入的字符串(可选语句)
    31.     Serial.println(comdata);
    32.       //显示刚才输入的字符串长度(可选语句)
    33.     Serial.println(comdata.length());
    34.  
    35. /*******************下面是重点*******************/
    36. //以串口读取字符串长度循环,
    37.     for(int i = 0; i < comdata.length() ; i++)
    38.     {
    39.     //逐个分析comdata[i]字符串的文字,如果碰到文字是分隔符(这里选择逗号分割)则将结果数组位置下移一位
    40.     //即比如11,22,33,55开始的11记到numdata[0];碰到逗号就j等于1了,
    41.     //再转换就转换到numdata[1];再碰到逗号就记到numdata[2];以此类推,直到字符串结束
    42.       if(comdata[i] == ',')
    43.       {
    44.         j++;
    45.       }
    46.       else
    47.       {
    48.          //如果没有逗号的话,就将读到的数字*10加上以前读入的数字,
    49.          //并且(comdata[i] - '0')就是将字符'0'的ASCII码转换成数字0(下面不再叙述此问题,直接视作数字0)。
    50.          //比如输入数字是12345,有5次没有碰到逗号的机会,就会执行5次此语句。
    51.          //因为左边的数字先获取到,并且numdata[0]等于0,
    52.          //所以第一次循环是numdata[0] = 0*10+1 = 1
    53.          //第二次numdata[0]等于1,循环是numdata[0] = 1*10+2 = 12
    54.          //第三次是numdata[0]等于12,循环是numdata[0] = 12*10+3 = 123
    55.          //第四次是numdata[0]等于123,循环是numdata[0] = 123*10+4 = 1234
    56.          //如此类推,字符串将被变成数字0。
    57.         numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
    58.       }
    59.     }
    60.     //comdata的字符串已经全部转换到numdata了,清空comdata以便下一次使用,
    61.     //如果不请空的话,本次结果极有可能干扰下一次。
    62.     comdata = String("");
    63.  
    64.  
    65.     //循环输出numdata的内容,并且写到PWM引脚
    66.     for(int i = 0; i < 6; i++)
    67.     {
    68.       Serial.print("Pin ");
    69.       Serial.print(PWMPin[i]);
    70.       Serial.print(" = ");
    71.       Serial.println(numdata[i]);
    72.       analogWrite(PWMPin[i], numdata[i]);
    73.       numdata[i] = 0;
    74.     }
    75.     //输出之后必须将读到数据的mark置0,不置0下次循环就不能使用了。
    76.     mark = 0;
    77.   }
    78. }
     
     
    已有 1 人评分金币收起 理由
    弘毅 + 5 对群里的问题进行了详解,赞。
  • 相关阅读:
    C# WinForm API 改进单实例运行
    CF1310D Tourism [随机化]
    CF1311E Construct the Binary Tree
    [IOI2018] werewolf 狼人 [kruskal重构树+主席树]
    #6029. 「雅礼集训 2017 Day1」市场 [线段树]
    P5840 [COCI2015]Divljak [AC自动机,链并]
    CF547E Mike and Friends [AC自动机,离线树状数组]
    P5112 FZOUTSY
    CF 150E Freezing with Style [长链剖分,线段树]
    CF1230E Kamil and Making a Stream
  • 原文地址:https://www.cnblogs.com/qqhfeng/p/3948101.html
Copyright © 2020-2023  润新知