串口控制操作搞不定,求教

lqk 20cm2020-02-1189 次点击1 人感谢


串口接收完数据可以正确返回,但是没办法正确处理命令, if (val == 'G+' )单引号的话就自动执行G+10,双引号的话就自动执行B+10,完全不受控制,不知道是哪里的原因,用的是Arduino Nano.
文件下载http://www.liquankun.xyz/WS2812-5050-time.ino

/*
EEPROM.write(i,value);//存储数据i=地址,value=数据
*/
#include "FastLED.h" // 此示例程序需要使用FastLED库
#define NUM_LEDS 28 // LED灯珠数量
#define DATA_PIN 9 // Arduino输出控制信号引脚
#define LED_TYPE WS2812 // LED灯带型号
#define COLOR_ORDER GRB // RGB灯珠中红色、绿色、蓝色LED的排列顺序
int WS_G = 5;// 红色
int WS_R = 5;// 绿色
int WS_B = 5;// 蓝色
String val = "";
uint8_t max_bright = 128; // LED亮度控制变量,可使用数值为 0 ~ 255, 数值越大则光带亮度越高

CRGB leds[NUM_LEDS]; // 建立光带leds

void setup() {‌
LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // 初始化光带
FastLED.setBrightness(max_bright); // 设置光带亮度
Serial.begin(9600);
while(Serial.read()>= 0){‌} //清除串行缓冲区
}

void loop() {‌
val = Serial.readString(); //读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val
if (val == 'G+' ){‌
if ( WS_G < 255 || WS_G > 0 ) {‌
WS_G = WS_G + 10;
Serial.println("G+10");
} else if (WS_G < 0) {‌
Serial.println("G=MIX");
} else if (WS_G > 255) {‌
Serial.println("G=MAX");
}
} else if (val == "G-"){‌
if ( WS_G < 255 || WS_G > 0 ) {‌
WS_G = WS_G - 10;
Serial.println("G-10");
} else if (WS_G < 0) {‌
Serial.println("G=MIX");
} else if (WS_G > 255) {‌
Serial.println("G=MAX");
}
} else if (val == "R+"){‌
if ( WS_R < 255 || WS_R > 0 ) {‌
WS_R = WS_R + 10;
Serial.println("R+10");
} else if (WS_R < 0) {‌
Serial.println("R=MIX");
} else if (WS_R > 255) {‌
Serial.println("R=MAX");
}
} else if (val == "R-"){‌
if ( WS_R < 255 || WS_R > 0 ) {‌
WS_R = WS_R - 10;
Serial.println("R-10");
} else if (WS_R < 0) {‌
Serial.println("R=MIX");
} else if (WS_R > 255) {‌
Serial.println("R=MAX");
}
} else if (val == "B+"){‌
if ( WS_B < 255 || WS_B > 0 ) {‌
WS_B = WS_B + 10;
Serial.println("B+10");
} else if (WS_B < 0) {‌
Serial.println("B=MIX");
} else if (WS_B > 255) {‌
Serial.println("B=MAX");
}
} else if (val == "B-"){‌
if ( WS_B < 255 || WS_B > 0 ) {‌
WS_B = WS_B - 10;
Serial.println("B-10");
} else if (WS_B < 0) {‌
Serial.println("B=MIX");
} else if (WS_B > 255) {‌
Serial.println("B=MAX");
}
}
Serial.println(val);
leds[0] = CRGB(WS_G, WS_R, WS_B); // 设置光带中第一个灯珠颜色为红色,leds[0]为第一个灯珠,leds[1]为第二个灯珠
FastLED.show(); // 更新LED色彩
val = "";
delay(500);
}

收藏 ♥ 感谢
Spoony 小组长 2020-02-11 
程序能运行,效果不符合预期。这种情况只能设断点调试,耐心一点一点检查各行代码是否正确执行然后检查逻辑。
lqk 20cm 2020-02-11 
@Spoony 操作的时候程序并不会进入if循环但是输出接收到的数据是正常的,是什么原因呢
Spoony 小组长 2020-02-11 
@lqk 进入哪个if?接收的数据是哪行传的数据?
lqk 20cm 2020-02-12 
#include "FastLED.h" // 此示例程序需要使用FastLED库
#define NUM_LEDS 28 // LED灯珠数量
#define DATA_PIN 9 // Arduino输出控制信号引脚
#define LED_TYPE WS2812 // LED灯带型号
#define COLOR_ORDER GRB // RGB灯珠中红色、绿色、蓝色LED的排列顺序
int WS_G = 5;// 红色
int WS_R = 5;// 绿色
int WS_B = 5;// 蓝色
String val = "";
uint8_t max_bright = 128; // LED亮度控制变量,可使用数值为 0 ~ 255, 数值越大则光带亮度越高

CRGB leds[NUM_LEDS]; // 建立光带leds

void setup() {‌
LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // 初始化光带
FastLED.setBrightness(max_bright); // 设置光带亮度
Serial.begin(9600);
while (Serial.read() >= 0) {‌

} //清除串行缓冲区
}
void loop() {‌
val = Serial.readString(); //读取PC 机发送给Arduino 的指令或字符,并将该指令或字符赋给val
if (val == 'G+' ) {‌//判断接收到的数据
if ( WS_G < 255 || WS_G > 0 ) {‌
WS_G = WS_G + 10;
Serial.println("G+10");
} else if (WS_G < 0) {‌
‌Serial.println("G=MIX");
} else if (WS_G > 255) {‌
‌Serial.println("G=MAX");
}
}
Serial.println(val);
leds[0] = CRGB(WS_G, WS_R, WS_B); // 设置光带中第一个灯珠颜色为红色,leds[0]为第一个灯珠,leds[1]为第二个灯珠
FastLED.show(); // 更新LED色彩
val = "";
delay(500);
}

/*只会回显val的数据但是并不会执行R+的操作,但是把if的条件改成val == 'G'就很神奇的可以操作 */
Spoony 小组长 2020-02-12 
只会回显val的数据但是并不会执行R+的操作,说明if条件没有进入。
把R+改成G就可以了是这个意思吗?
lqk 20cm 2020-02-12  ♥ 1
@Spoony 弄了好久问题解决了,还加入了存档系统,后期要做成用WS2812仿辉光灯。
问题出在串口接收数据缓存val这个变量上面,优化之后就好了,串口发送的时候还得选没有结束符否则也没法正常运行
/*
* 串口命令:
G+ 红色亮度+10
R+ 绿色亮度+10
B+ 蓝色亮度+10
G- 红色亮度-10
R- 绿色亮度-10
B- 蓝色亮度-10
CS 存储颜色数值到内存
*/
#include <EEPROM.h>
#include "FastLED.h" // 此示例程序需要使用FastLED库
#define NUM_LEDS 28 // LED灯珠数量
#define DATA_PIN 9 // Arduino输出控制信号引脚
#define LED_TYPE WS2812 // LED灯带型号
#define COLOR_ORDER GRB // RGB灯珠中红色、绿色、蓝色LED的排列顺序
int WS_G;// 红色
int WS_R;// 绿色
int WS_B;// 蓝色
String val = "";//初始化串口缓存
uint8_t max_bright = 128; // LED亮度控制变量,可使用数值为 0 ~ 255, 数值越大则光带亮度越高
byte valueG;
byte valueR;
byte valueB;
CRGB leds[NUM_LEDS]; // 建立光带leds

void setup() {‌
LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // 初始化光带
FastLED.setBrightness(max_bright); // 设置光带亮度
Serial.begin(9600);
/*↓↓↓↓↓↓读取内存中的颜色数值↓↓↓↓↓↓*/
valueG = EEPROM.read(1);
valueR = EEPROM.read(2);
valueB = EEPROM.read(3);
WS_G = valueG;
WS_R = valueR;
WS_B = valueB;
/*↑↑↑↑↑↑读取内存中的颜色数值↑↑↑↑↑↑*/
}

void loop() {‌
/* 当串口有数据的时候,将数据拼接到变量comdata */
while (Serial.available() > 0)
{‌
val += char(Serial.read());
delay(50);
}
if (val == "G+" ) {‌
WS_G = WS_G + 10;
Serial.println("G+10");
} else if (val == "G-") {‌
WS_G = WS_G - 10;
Serial.println("G-10");
} else if (val == "R+") {‌
WS_R = WS_R + 10;
Serial.println("R+10");
} else if (val == "R-") {‌
WS_R = WS_R - 10;
Serial.println("R-10");
} else if (val == "B+") {‌
WS_B = WS_B + 10;
Serial.println("B+10");
} else if (val == "B-") {‌
WS_B = WS_B - 10;
Serial.println("B-10");
} else if (val == "CS") {‌
//EEPROM.write(i,value);//存储数据i=地址,value=数据 byte valueG;
EEPROM.write(1, WS_G);
EEPROM.write(2, WS_R);
EEPROM.write(3, WS_B);
valueG = EEPROM.read(1);
valueR = EEPROM.read(2);
valueB = EEPROM.read(3);
Serial.println("已保存 ");
Serial.print(" G= ");
Serial.print(valueG);
Serial.print(" R= ");
Serial.print(valueR);
Serial.print(" B= ");
Serial.println(valueB);
}
if (WS_G > 256) {‌
WS_G = 255 ;
Serial.println("G=MAX");
}
if (WS_G < 0) {‌
WS_G = 1 ;
Serial.println("G=MIX");
}
if (WS_R > 256) {‌
WS_R = 255 ;
Serial.println("R=MAX");
}
if (WS_R < 0) {‌
WS_R = 1 ;
Serial.println("R=MIX");
}
if (WS_R > 256) {‌
WS_R = 255 ;
Serial.println("B=MAX");
}
if (WS_R < 0) {‌
WS_R = 1 ;
Serial.println("B=MIX");
}
/*↓↓↓↓↓↓DeBUG↓↓↓↓↓↓*/
/*
Serial.println(val);//输出串口保存到数据
Serial.print("G= ");
Serial.print(WS_G);//G值
Serial.print(" R= ");
Serial.print(WS_R);//R值
Serial.print(" B= ");
Serial.println(WS_B);//B值
valueG = EEPROM.read(1);
valueR = EEPROM.read(2);
valueB = EEPROM.read(3);
Serial.println("内存数据GRB ");
Serial.println(valueG);
Serial.println(valueR);
Serial.println(valueB);
*/
/*↑↑↑↑↑↑DeBUG↑↑↑↑↑↑*/
leds[0] = CRGB(WS_G, WS_R, WS_B); // 设置光带中第一个灯珠颜色为红色,leds[0]为第一个灯珠,leds[1]为第二个灯珠
FastLED.show(); // 更新LED色彩
val = "";//串口缓存清空
delay(500);
}
Spoony 小组长 2020-02-12 
解决就好,还是需要耐心自己调试靠谱

登录注册 后可回复。

这里由以下店铺的技术人员在此免费提供能力范围内的技术支持。

NXEZ 创客商店(淘宝)

排障问题发帖注意事项:
1、请尽可能将故障说明清晰,列明例如使用环境和做了哪些操作和配置等。
2、排障中已经做了哪些尝试,如果能在问题中进行描述将极大提高解决问题的效率。
3、对于需要自身完成知识积累才能解决的问题,请自行通过搜索引擎寻找资料学习。