c++ - I2C 通信在 2 个 arduino 之间不起作用
问题描述
我试图让两个 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 中。几乎现在我的代码已更新为 -
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");
}```
推荐阅读
- arrays - 将数组传递给 Vue 中的 Laravel 视图
- node.js - 我们可以在nodejs中使用http包和docker吗
- sql - 有条件地从两个表之一中选择值
- python - opencv:WarpPerspective 不规则轮廓变换
- java - 如何解决java中的俄语编码?
- java - RuntimeException(它是未检查异常的基类)的父类如何成为异常(已检查异常的基类)?
- c# - System.InvalidOperationException: '无法分配没有元素的本机控件;
- python - 无效的幻数 - 无法使用 python 的 gzip 模块解压缩文件
- javascript - 无法读取动态创建的文本框的值。面对未定义的 html 错误
- c++ - OpenGL中的基本重力实现