Несколько подчиненных (отправителей) одному ведущему (получателю)
Прошу вашей помощи моему проекту Я хочу отправить данные от ведомого устройства к ведущему, но из двух ведомых устройств получен только один данные.
//мастер
#include <Wire.h>
void setup() {
Wire.begin(); // подключаемся к шине i2c (адрес для ведущего необязателен)
Serial.begin(9600); // запускаем последовательный порт для вывода
}
void loop() {
Wire.requestFrom(8, 1); // запрос 6 байт от ведомого устройства №8
while (Wire.available()) { // подчиненное устройство может отправить меньше, чем запрошено
char c= Wire.read(); // получаем байт как символ
char q= Wire.read();
Serial.print(c); // печатаем символ
Serial.print(q);
}
delay(1500);
}
////ведомый 1
#include <Wire.h>
void setup() {
Serial.begin(9600); // Запуск последовательного терминала
Wire.begin(8); // подключаемся к шине i2c по адресу №8
}
void loop(){
Wire.onRequest(requestEvent); // регистрируем событие
delay(1500);
}
void requestEvent() {
Wire.write('Q');
Serial.println("Sent");
}
////ведомый 2
#include <Wire.h>
void setup() {
Serial.begin(9600); // Запуск последовательного терминала
Wire.begin(8); // подключаемся к шине i2c по адресу №8
}
void loop() {
Wire.onRequest(requestEvent); // регистрируем событие
delay(1500);
}
void requestEvent() {
Wire.write('Y');
Serial.println("Sent");
}
@Chi Ri, 👍0
Обсуждение1 ответ
Невозможно иметь 2 устройства с одинаковым адресом на шине I2C. Если они оба попытаются отправить одновременно разные данные, данные либо будут повреждены, либо один из подчиненных устройств перестанет отправлять. С помощью I2C вы не можете запросить данные более чем с одного устройства одновременно.
Вы должны дать подчиненным устройствам разные адреса. Затем вам придется выполнять запросы последовательно: сначала запрос (с соответствующим чтением) к первому подчиненному устройству, а после этого вы можете запустить второй запрос (с соответствующим чтением).
Кроме того, код чтения не очень хорош. Вы тестируете условие цикла while
, есть ли что-нибудь для чтения (это может быть только 1 байт), но затем вы читаете 2 байта. В вашем случае вам нужно прочитать только 1 байт, поскольку вы также запрашиваете только 1 байт. В случае, когда вы запрашиваете более 1 байта, вы можете либо проверить, достаточно ли байтов в буфере (с помощью чего-то вроде if(Wire.available()>=2)
), или вы можете просто работать с буфером побайтно (с помощью while(Wire.available()){ data = Wire.read();
, обратите внимание на одно чтение в цикле while).< /п>
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отправить строку на мастер с помощью i2c
- Как выбрать альтернативные контакты I2C на ESP32?
- Что означает в I2C «NACK получен»?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Несколько датчиков I2C с одинаковым адресом
Я думаю, что оба подчиненных устройства имеют один и тот же адрес, поэтому вы сталкиваетесь с этими проблемами, потому что главный общается с обоими подчиненными устройствами с одинаковым адресом и получает только одни данные, которые могут быть подчиненными 1 или 2. Вам необходимо изменить адрес подчиненного устройства и синхронизировать связь обоих раб с господином., @Vaibhav
Какое оборудование, например микроконтроллер, вы используете?, @MichaelT