I2C 通信在 2 个 arduino 之间不起作用

I2C Communication not working between 2 arduinos

我正在尝试让两个 Arduino 通过 I2C 相互通信。我正在尝试从发射器向接收器发送一个字符串,让接收器接收它并将其放入 SD 卡中。 if(Wire.available() > 0) 也不执行,我不确定这是发射器或接收器还是硬件的问题。对于硬件,我有 A4 -> A4、A5 -> A5 和 GND 到 GND。我不确定为什么无法接收或传输通信。这是我 运行 -

的代码

发射器:

void setup(){
   Serial.begin(115200);
   Wire.begin();
}

void loop(){
    Wire.beginTransmission(9); 
    Wire.write("GPS: ");
    Wire.write(Latitude + Longitude).c_str());

    Wire.write("Altitude: ");
    Wire.write((Altitude).c_str());

    Wire.write(("Parachute: " + ReceivedParachuteStatus).c_str());
    
    digitalWrite(interruptPin, HIGH);
    digitalWrite(interruptPin, LOW);
    Wire.endTransmission();
}

接收者:

void interruptServiceRoutine() {
  if (Wire.available() > 0) {
    if (SD.begin(CS_PIN)) {
      failCounter = 0;
      failCounterCOM = 0;
      LED_Trigger = true;

      incomingString = Wire.read(); 
      File SD_file = SD.open("log.txt", FILE_WRITE);

      SD_file.print(incomingString);
      Serial.println(incomingString);
      SD_file.close();
    } else {
        if (SD.begin(CS_PIN)) {
          failCounter++;
          
          File SD_file = SD.open("log.txt", FILE_WRITE);
          SD_file.println("SD Card Connection Fail: " + failCounter);
        }

      Serial.println("SD Card Connection Fail: " + failCounter);
      SD_file.close();
    }
   } else {
    if (SD.begin(CS_PIN)) {
      failCounterCOM++;
      
      File SD_file = SD.open("log.txt", FILE_WRITE);
      SD_file.println("Master MCU COM fail: " + failCounterCOM);
    }
    
    Serial.println("Master MCU COM fail: " + failCounterCOM);
    SD_file.close();
  }
}

void setup() {
  Serial.begin(115200);
  Wire.begin(9);

  pinMode(LED, OUTPUT);

  pinMode(interruptPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin), interruptServiceRoutine, RISING);

  if (!SD.begin(CS_PIN)) 
    Serial.println("Failed to connect to SD card");
}

问题是 incomingString = Wire.read();应该在 receiveEvent() 中;功能。您需要 Wire.onReceive 中的 those.And 之一。现在我的代码几乎更新为 -

void receiveEvent(int bytes){
  incomingString = Wire.read();
}
void interruptServiceRoutine() {
  if (Wire.available() > 0) {
    if (SD.begin(CS_PIN)) {
      failCounter = 0;
      failCounterCOM = 0;
      LED_Trigger = true;

      File SD_file = SD.open("log.txt", FILE_WRITE);

      SD_file.print(incomingString);
      Serial.println(incomingString);
      SD_file.close();
    } else {
        if (SD.begin(CS_PIN)) {
          failCounter++;
          
          File SD_file = SD.open("log.txt", FILE_WRITE);
          SD_file.println("SD Card Connection Fail: " + failCounter);
        }

      Serial.println("SD Card Connection Fail: " + failCounter);
      SD_file.close();
    }
   } else {
    if (SD.begin(CS_PIN)) {
      failCounterCOM++;
      
      File SD_file = SD.open("log.txt", FILE_WRITE);
      SD_file.println("Master MCU COM fail: " + failCounterCOM);
    }
    
    Serial.println("Master MCU COM fail: " + failCounterCOM);
    SD_file.close();
  }
}

void setup() {
  Serial.begin(115200);
  Wire.begin(9);
  Wire.onReceive(receiveEvent);

  pinMode(LED, OUTPUT);

  pinMode(interruptPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin), interruptServiceRoutine, RISING);

  if (!SD.begin(CS_PIN)) 
    Serial.println("Failed to connect to SD card");
}```