#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毫秒 }优化一下这段代码
时间: 2024-03-20 15:42:16 浏览: 129
以下是对代码的一些优化:
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);
}
```
阅读全文