【问题标题】:I2C Communication not working between 2 arduinosI2C 通信在 2 个 arduino 之间不起作用
【发布时间】:2021-03-22 13:55:39
【问题描述】:

我正在尝试让两个 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");
}

【问题讨论】:

  • 接收器是否在 I2C 地址 9 上,是否配置为从设备?
  • 是的,你可以在代码中自己看到。
  • 我在代码中看不到地址是否正确。
  • 在接收器的设置函数中我说的是 Wire.begin(9)

标签: c++ arduino communication i2c


【解决方案1】:

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

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");
}```

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2017-01-14
    相关资源
    最近更新 更多