虽然书中讲解的很详细,但是涉及了一点点指针的用法,然而小道学习过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);
}
}
代码注释已尽量写清楚了。
网友评论