You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

特定Arduino程序编译失败求助:exit status 1错误

嘿,我来帮你搞定这个Arduino编译报错的问题!从你贴的代码和描述来看,咱们可以从几个关键地方入手排查:

1. 最核心的问题:缺少loop()函数

Arduino的程序结构要求必须同时包含setup()loop()两个函数——哪怕loop()里什么逻辑都不写,编译器也会默认依赖这个函数的存在。你的代码里只有setup()serialEvent(),这直接会触发编译错误,也是你换开发板依然报错的核心原因之一。

赶紧补上这个函数:

void loop() {
  // 这里可以留空,或者后续添加你需要的循环逻辑
}

2. 字符串处理函数的边界隐患

你的Xc()Yc()函数里直接用了indexOf()的返回值来操作字符串,但如果串口传来的数据里没有XY字符,indexOf()会返回-1,这时候data.remove(-1)之类的操作会触发运行时(甚至编译)错误。咱们给这两个函数加上边界检查,同时优化字符串提取逻辑:

int Xc(String data){
  int xStart = data.indexOf("X") + 1;
  int yStart = data.indexOf("Y");
  // 检查是否找到有效索引,避免错误
  if(xStart == 0 || yStart == -1 || xStart >= yStart){
    return 0; // 返回默认值,可根据需求调整
  }
  String xStr = data.substring(xStart, yStart);
  return xStr.toInt();
}

int Yc(String data){
  int yStart = data.indexOf("Y") + 1;
  if(yStart == 0){ // 没找到Y字符
    return 0;
  }
  String yStr = data.substring(yStart);
  return yStr.toInt();
}

3. 额外的优化建议

  • 初始化未赋值的变量:XY目前没有初始值,虽然不是编译错误,但可能导致运行时异常,建议改成int X = 0; int Y = 0;
  • 检查AFMotor库兼容性:打开Arduino IDE的「库管理器」,搜索并确认AFMotor库已正确安装,版本适配你的IDE版本。如果是手动安装的库,确保文件路径正确、没有损坏。

修复后的完整代码

#include <AFMotor.h>
int px = 0;
int py = 0;
int X = 0;
int Y = 0;
String serialData;
AF_DCMotor right(3);
AF_DCMotor left(4);

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(10);
  right.setSpeed(400);
  left.setSpeed(400);
}

void loop() {
  // 空循环,满足Arduino程序结构要求
}

void serialEvent() {
  serialData = Serial.readString();
  X = Xc(serialData);
  Y = Yc(serialData);
  if(X < px){
    right.run(BACKWARD);
    left.run(BACKWARD);
    delay(X * 10);
    px = X;
  }
  right.run(RELEASE);
  left.run(RELEASE);
}

int Xc(String data){
  int xStart = data.indexOf("X") + 1;
  int yStart = data.indexOf("Y");
  if(xStart == 0 || yStart == -1 || xStart >= yStart){
    return 0;
  }
  String xStr = data.substring(xStart, yStart);
  return xStr.toInt();
}

int Yc(String data){
  int yStart = data.indexOf("Y") + 1;
  if(yStart == 0){
    return 0;
  }
  String yStr = data.substring(yStart);
  return yStr.toInt();
}

把上面的代码替换你原来的版本,再尝试编译,应该就能解决那个exit status 1的错误了!

内容的提问来源于stack exchange,提问作者Christopher Oosthuizen

火山引擎 最新活动