void loop() { if(Serial.available()>0) { serialData = Serial.read(); //接收信号 if(serialData == '1') //如果接收到信号1 { for(int i = 0;i <=17 ;i++) { if(i >NUM_LEDS) { i=0; x++; } if (x>=16) { x=0; } leds[x] = CRGB::Red; leds[x-1] = CRGB::Black; leds[i] = CRGB::Red; leds[i-1] = CRGB::Black; if(x==i-1) { leds[x] = CRGB::Red; } if(Serial.available()>0) { serialData = Serial.read(); //接收信号 if(serialData == '2') { break; } } fill_solid(leds+x,1,CRGB::Red); fill_solid(leds+i,1,CRGB::Red); FastLED.show(); FastLED.show(); delay(500); } //500ms x++当x>=16时x赋值0并z++当z>=16时z等于0 if(Serial.available()>0) { serialData = Serial.read(); //接收信号 if(serialData == '3') { clean(); for(int i = 0;i <8 ;i++) { x=15-i; leds[i] = CRGB::Red; FastLED.show(); delay(100); leds[x] = CRGB::Red; FastLED.show(); delay(100); leds[i-1] = CRGB::Black; FastLED.show(); delay(100); leds[x+1] = CRGB::Black; FastLED.show(); delay(100); } /* code */ }为什么收到3无法工作
时间: 2024-02-14 13:30:21 浏览: 28
根据您提供的代码,当接收到信号为'3'时,应该执行一个名为"clean"的函数,并且在该函数中进行一些LED灯的控制操作。然而,根据您提供的代码片段,我们无法看到"clean"函数的定义部分。因此,无法确定问题出在哪里。
请确保在您的代码中有定义"clean"函数,并且该函数中包含了正确的LED灯控制操作。如果这个函数没有定义或者定义不正确,那么当收到信号为'3'时,代码就无法正常工作。
此外,还要确保程序中没有其他可能导致问题的错误,例如其他部分的逻辑错误、变量未初始化等。您可以检查一下程序中是否存在其他可能影响到代码执行的问题,并逐步调试排查错误。
如果您能提供更完整的代码和问题描述,我将能够更准确地帮助您解决问题。
相关问题
void clean() { fill_solid(leds,16,CRGB::Black); FastLED.show(); } int x; void loop() { if(Serial.available()>0) { serialData = Serial.read(); //接收信号 if(serialData == '1') //如果接收到信号1 { for(int i = 0;i <=17 ;i++) { if(i >NUM_LEDS) { i=0; x++; } if (x>=16) { x=0; } leds[x] = CRGB::Red; leds[x-1] = CRGB::Black; leds[i] = CRGB::Red; leds[i-1] = CRGB::Black; if(x==i-1) { leds[x] = CRGB::Red; } if(Serial.available()>0) { serialData = Serial.read(); //接收信号 if(serialData == '2') { break; } } fill_solid(leds+x,1,CRGB::Red); fill_solid(leds+i,1,CRGB::Red); FastLED.show(); FastLED.show(); delay(500); } //500ms x++当x>=16时x赋值0并z++当z>=16时z等于0 if(Serial.available()>0) { serialData = Serial.read(); //接收信号 if(serialData == '3') { clean(); for(int i = 0;i <8 ;i++) { x=15-i; leds[i] = CRGB::Red; FastLED.show(); delay(100); leds[x] = CRGB::Red; FastLED.show(); delay(100); leds[i-1] = CRGB::Black; FastLED.show(); delay(100); leds[x+1] = CRGB::Black; FastLED.show(); delay(100); } /* code */ }
根据您提供的代码,可以看到您定义了一个名为"clean"的函数,并在函数内部执行了一些LED灯的控制操作。当收到信号为'3'时,程序会调用"clean"函数来实现清空LED灯的效果。
在主循环函数"loop"中,当收到信号为'1'时,程序会执行一段LED灯的控制逻辑。当收到信号为'2'时,程序会跳出循环。当收到信号为'3'时,程序会调用"clean"函数并执行一段特定的LED灯控制逻辑。
根据您提供的代码,看起来在收到信号为'3'时,调用"clean"函数没有问题。请确保您的硬件连接和其他部分的代码逻辑都正确,以便程序能够正常工作。
如果您有其他问题或需要进一步的帮助,请随时提问。
#include <Servo.h> //引入lib Servo myservo1; // 创建一个伺服电机对象 Servo myservo2; char inByte = 0; //串口接收的数据 int angle = 90; //角度值 String temp = "";//临时字符变量,又或者说是缓存用的吧 void setup() { myservo1.attach(9); //10引脚连接水平舵机,9链接垂直舵机 myservo2.attach(10); //定义舵机的引脚为9,舵机只能是10或者9引脚 Serial.begin(115200); //设置波特率 myservo1.write(90); //初始角度90度 myservo2.write(0); //初始角度是0度 } void loop() { while (Serial.available() > 0) //判断串口是否有数据 { inByte = Serial.read();//读取数据,串口一次只能读1个字符 temp += inByte;//把读到的字符存进临时变量里面缓存, //再继续判断串口还有没有数据,知道把所有数据都读取出来 } if(temp.length() >= 3 ) //判断临时变量是否为空 { if(temp.substring(0,2) == "RV") //控制上面左右摆动的舵机 { temp = temp.substring(2); angle = temp.toInt(); if (angle >= 0) { myservo1.write(angle); Serial.println(angle); } } if(temp.substring(0,2) == "RH") //控制底部水平转动舵机 { temp = temp.substring(2); angle = temp.toInt(); if (angle >= 0) { myservo2.write(angle); //控制舵机转动相应的角度。 Serial.println(angle); //输出数据到串口上,以便观察 } } } temp = ""; delay(100);//延时100毫秒 }优化一下这段代码
以下是对代码的一些优化:
1. 使用常量代替魔法数值,增加代码可读性和可维护性。
2. 使用串口数据读取函数 Serial.readBytesUntil() 代替 while 循环读取,精简代码。
3. 删除不必要的空格和注释,简化代码。
4. 对串口数据进行校验,以防止无效数据干扰舵机控制。
5. 使用更加严谨的条件语句,提高代码健壮性。
下面是优化后的代码:
```c++
#include <Servo.h>
const int HORIZONTAL_PIN = 9;
const int VERTICAL_PIN = 10;
const int BAUD_RATE = 115200;
const int DELAY_TIME = 100;
Servo horizontalServo;
Servo verticalServo;
void setup() {
horizontalServo.attach(HORIZONTAL_PIN);
verticalServo.attach(VERTICAL_PIN);
Serial.begin(BAUD_RATE);
horizontalServo.write(90);
verticalServo.write(0);
}
void loop() {
if (Serial.available() > 0) {
char buffer[3];
int bytesRead = Serial.readBytesUntil('\n', buffer, 3);
if (bytesRead == 2 && buffer[0] == 'R') {
int angle = buffer[1] - '0';
if (angle >= 0 && angle <= 9) {
if (buffer[0] == 'V') {
horizontalServo.write(angle * 10);
Serial.println(angle * 10);
} else if (buffer[0] == 'H') {
verticalServo.write(angle * 10);
Serial.println(angle * 10);
}
}
}
}
delay(DELAY_TIME);
}
```