功能如题目。 在串口收到逗号分割的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. //定义一个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 对群里的问题进行了详解,赞。

Arduino学习笔记A6(补充) - 在串口读取多个字符串,并且转换为数字数组的更多相关文章

  1. 【Arduino学习笔记08】使用串口监视器显示数据

    代码及相关说明: 1 // 示例:读取模拟输入并显示在串口监视器中 2 3 const int ANALOG_IN = 0; 4 int val = 0; 5 6 void setup(){ 7 Se ...

  2. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...

  3. Arduino学习笔记① 初识Arduino

    1.前言     近段时间,博主陆续更新了ESP8266学习笔记,主要开发平台是Arduino.但是,对于很多无基础的初学者来说,甚至不了解Arduino是什么.因此,博主决定加入一个Arduino学 ...

  4. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  5. STM32学习笔记(二)——串口控制LED

    开发板芯片:STM32F407ZGT6 PA9-USART1_TX,PA10-USART1_RX; PF9-LED0,PF10-LED1; 一.串口1配置过程(不使用串口中断): 1.使能时钟,包括G ...

  6. Sass学习笔记(补充)

    阅读目录 1. Sass和SCSS的区别 2. @while循环 3. @at-root 4. @content 5. 凸显注释 6. CSS输出样式 7. 重置浏览器样式 8. Sass调试和@de ...

  7. EF学习笔记(七):读取关联数据

    总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇参考原文链接:Reading Related Data 本章主要讲述加载显示关联数据: 数据加载分为以下三种 Lazy l ...

  8. Python学习笔记之从文件中读取数据

    10-1 Python 学习笔记:在文本编辑器中新建一个文件,写几句话来总结一下你至此学到的Python 知识,其中每一行都以“In Python you can”打头.将这个文件命名为learnin ...

  9. [Arduino] 在串口读取多个字符串,并且转换为数字数组

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

随机推荐

  1. python中利用类创建的对象来保存信息

    在类创建的对象中,一般都是以字典的方式来保存信息 class Student: def __init__(self, name, age, score): self.name = name self. ...

  2. CSS 文本垂直居中对齐

    文本垂直居中对齐是一个很常见的问题,这里总结一下. 一.容器高度固定,单行文本垂直居中对齐 height:20px; line-height:20px; overflow:hidden; 二.容器高度 ...

  3. Jmeter-ForEach控制器

    ForEach Controller需要配合‘用户定义的变量’来使用,作用是参数化 名称:字面意思,ForEach Controller的名称 注释:字面意思 输入变量前缀:变量的前缀:如要使用的变量 ...

  4. BZOJ1257 CQOI2007 余数之和 【数分块】

    BZOJ1257 CQOI2007 余数之和 Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值 其中 ...

  5. 微软 Windows 系统检测网络连通性(用于显示感叹号)竟然是通过访问一个特殊网址来实现的

    一次我走到了弱网环境中,意外地发现浏览器打开了 http://www.msftconnecttest.com/redirect 网址,随后右下角的网络图标出现了一枚“感叹号”.   吹水的推断 从直观 ...

  6. jQuery 异步和同步请求

    在jQuery Ajax里面有一个async 参数 , 默认值 为true , 请求为异步请求 , false 为同步请求 .. 使用ajax加载数据返回页面并赋值,然后前端取出该值 这其中涉及到代码 ...

  7. 变色DNA(最短路思维题)

    个人心得:太水了,还是对最短路不太深入了解,无法构建出最短路模板,然后就是读题能力, 这题的关键在于转换为最短路模板,因为DFS我在24组超时了. 假设把从i到j的代价看做是权值,那么就是对权值的确立 ...

  8. 用Python做图像处理

    转自:http://blog.csdn.net/gzlaiyonghao/article/details/1852726  最近在做一件比较 evil 的事情——验证码识别,以此来学习一些新的技能.因 ...

  9. cmd连接mysql操作命令

    连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车) 创建授权:grant select on 数据库.* to 用户名@登 ...

  10. ballerina 学习三 根据swagger 以及protobuf 生成code

    备注: 基本环境安装就不用介绍了,swagger 以及grpc 同时也不用介绍了,都是比较简单的代码,就是一个简单的测试 1.   初始化项目 ballerina init 项目结构如下: ├── R ...