arduino从基础到实践项目10代码分析

2020-03-28  本文已影响0人  猛犸象和剑齿虎

虽然书中讲解的很详细,但是涉及了一点点指针的用法,然而小道学习过VBA和python都没有涉及指针的概念,所以就尝试着用用看。

RGB 控制串口彩灯

image.png

彩图很清晰,所以就不放实物图了。

//串口控制彩灯

char buffer[18];
/*设置一个字符型数组,长度为18,r255,g255,b255(NULL),
在文本的末端有一个看不见的字符NULL,书上没有解释为什么
数的是17个字符。定义长度18保证不会溢出。*/
int red,green,blue;//声明整型变量存储红绿蓝数值和引脚号

int RedPin = 11;
int GreenPin = 10;
int BluePin =9;

void setup()
{
  Serial.begin(9600);//开始串口通讯,9600是波特率每秒中信号或脉冲数
  Serial.flush();//清空串口残留字符,为输入输出做准备
  pinMode(RedPin,OUTPUT);//设置3个引脚为输出引脚
  pinMode(GreenPin,OUTPUT);
  pinMode(BluePin,OUTPUT);
  }

void loop()
{
  if (Serial.available()>0)//检查是否有字符发送到串口,如果有则执行if语句
  {
    int index = 0;//用于存储字符数组中指针的位置。
    delay(100);//很重要,因为代码速度高于串口通信速度,所以等待一点时间
    int numChar =Serial.available();//字符个数装入变量
    if(numChar>15)//如果串口字符数大于15
    {
      numChar=15;//就将串口字符数量设置为15
      }
     while(numChar--)//如果numChar递减并大于0(numchar必然大于0,否则前面的if语句不会执行)
     {
      buffer[index++]=Serial.read();//将buffer空数组逐个写入串口的字符
      }
     splitString(buffer);//创建一个函数,用于拆分字符
    }
  }

  void splitString(char* data)
  /*
  c++程序不允许给函数传送字符型数组(真无奈),通过指针绕过这个限制,
  变量名前加一个星号* data,表明这是个指针,当然由于初次接触,还是不理解
  只当是个特殊的参数。可以用它变成一个指向另一个变量的变量。
  */
  {
    Serial.print("Data entered: ");//打印不解释hiahia~~
    Serial.println(data);
    char* parameter;//创建一个新变量,由于用到指针数据类型必须一致所以也加*号
    parameter = strtok(data," ,");
    /*strtok拆分字符函数,查找空格或者逗号,进行第一次分割。
     如果输入 r127 g56 b98第一次的值是r127
     */
    while(parameter!=NULL)//继续分割当字符串不为空时
    {
     setLED(parameter);//在这之间进行灯的亮度设置和操作,创建1个函数操作
     parameter = strtok(NULL," ,");//结尾部分直到分割完毕
      }

     for (int x=0; x<16;x++)//用于填充buffer数组,并清空缓存数据
     {
      buffer[x]="\0";
      }
    Serial.flush();
    
    }

  void setLED(char* data)//又见指针,无奈
  {
    if((data[0]=='r') || (data[0]=='R'))//如果第一个字符是r或者R执行
    {
      int Ans = strtol(data+1,NULL,10);
      /*
       定义一个整数变量,分割data+1,也就是从字符的第二个开始,后面一个参数是
       分隔符,因为已经分割完所以不用,传递NULL(暂时先这么理解吧,书上的指针
       概念看不懂,)
       第三个参数是基数,使用的是10进制。
       */
      Ans =constrain(Ans,0,255);//确保取出的数值在0到255之间,数字信号的范围。
      analogWrite(RedPin,Ans);//analogWrite(11,ans=0-255之间的数值)
      Serial.print("Red is set to: ");//打印,打印完毕
      Serial.println(Ans);
      }
     if((data[0]=='g') || (data[0]=='G'))//都一样
    {
      int Ans = strtol(data+1,NULL,10);
      Ans =constrain(Ans,0,255);
      analogWrite(GreenPin,Ans);
      Serial.print("Green is set to: ");
      Serial.println(Ans);
      } 
     if((data[0]=='b') || (data[0]=='B'))
    {
      int Ans = strtol(data+1,NULL,10);
      Ans =constrain(Ans,0,255);
      analogWrite(BluePin,Ans);
      Serial.print("Green is set to: ");
      Serial.println(Ans);
      } 
      
    }

代码注释已尽量写清楚了。

上一篇下一篇

猜你喜欢

热点阅读