极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: Ansifa

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

  [复制链接]
发表于 2017-3-24 11:11:54 | 显示全部楼层
3Q for sharing.
回复 支持 反对

使用道具 举报

发表于 2017-3-24 14:26:31 | 显示全部楼层
学习了  感谢!!
回复 支持 反对

使用道具 举报

发表于 2017-4-5 16:41:44 | 显示全部楼层
楼主代码有误,应为:

  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, OUTPUT);
  9.   Serial.begin(9600);
  10. }

  11. void loop()
  12. {
  13. //j是分拆之后数字数组的位置记数
  14.   int j = 0;
  15.   
  16.   //不断循环检测串口缓存,一个个读入字符串,
  17.   while (Serial.available() > 0)
  18.   {
  19.   //读入之后将字符串,串接到comdata上面。
  20.     comdata += char(Serial.read());
  21.       //延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
  22.     delay(2);
  23.     //标记串口读过数据,如果没有数据的话,直接不执行这个while了。
  24.     mark = 1;
  25.   }
  26.    
  27.   if(mark == 1)  //如果接收到数据则执行comdata分析操作,否则什么都不做。
  28.   {
  29.   //显示刚才输入的字符串(可选语句)
  30.     Serial.println(comdata);
  31.       //显示刚才输入的字符串长度(可选语句)
  32.     Serial.println(comdata.length());
  33.    
  34. /*******************下面是重点*******************/
  35. //以串口读取字符串长度循环,
  36.     for(int i = 0; i < comdata.length()-2 ; i++)
  37.     {
  38.     //逐个分析comdata字符串的文字,如果碰到文字是分隔符(这里选择逗号分割)则将结果数组位置下移一位
  39.     //即比如11,22,33,55开始的11记到numdata[0];碰到逗号就j等于1了,
  40.     //再转换就转换到numdata[1];再碰到逗号就记到numdata[2];以此类推,直到字符串结束
  41.       if(comdata[i] == ',')
  42.       {
  43.         j++;
  44.         //i++;
  45.       }
  46.       else
  47.       {
  48.          //如果没有逗号的话,就将读到的数字*10加上以前读入的数字,
  49.          //并且(comdata - '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.     //循环输出numdata的内容,并且写到PWM引脚
  64.     for(int i = 0; i < 6; i++)
  65.     {
  66.       Serial.print("Pin ");
  67.       Serial.print(PWMPin[i]);
  68.       Serial.print(" = ");
  69.       Serial.println(numdata[i]);
  70.       analogWrite(PWMPin[i], numdata[i]);
  71.       numdata[i] = 0;
  72.     }
  73.     //输出之后必须将读到数据的mark置0,不置0下次循环就不能使用了。
  74.     mark = 0;
  75.   }
  76. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2017-5-2 14:25:35 | 显示全部楼层
看的迷迷糊糊,自己不是很懂,完了要好好研究一下。感谢版主分享
回复 支持 反对

使用道具 举报

发表于 2017-8-11 19:53:23 | 显示全部楼层
有没有排列数组让数码管显示的?求求大神啦!
回复 支持 反对

使用道具 举报

发表于 2017-10-16 08:42:08 | 显示全部楼层
——学习了!
回复 支持 反对

使用道具 举报

发表于 2018-3-17 13:04:12 | 显示全部楼层
谢谢,学到东西了
回复 支持 反对

使用道具 举报

发表于 2018-8-7 09:04:26 | 显示全部楼层
佩服楼主,学习了,精神可嘉
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 14:16 , Processed in 0.046536 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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