Связь I2C не работает

Я работал над своим проектом, но обнаружил ошибку и мне нужен совет или исправление.

Я использую метод I2C для связи между главным и подчиненным устройствами. У меня два вопроса:

  1. Я отправляю 7 входных данных (от ведущего) ведомому, но получаю только 6.
  2. Сможет ли мой код выдать результат, подобный этому видео

Главный код

// Мастер-код
#include <Wire.h>
byte nChar =0;
char input[7];

void setup () {

  Serial.begin(9600);
  Wire.begin();
}

void loop()
{
  if (nChar < 7) {if (Serial.available()) { input[nChar++] = Serial.read();}}

    else {

      Wire.beginTransmission(1);

      //а
      Wire.write(input[0]);
      Serial.print("Drawer : ");
      Serial.println(input[0]);

      //Икс
      Wire.write(input[1]);
      Serial.print("Output : ");
      Serial.println(input[1]);

      //00
      Wire.write(input[2]);
      Wire.write(input[3]);
      Serial.print("Output : ");
      Serial.print(input[2]);
      Serial.println(input[3]);

      //у
      Wire.write(input[4]);
      Serial.print("Output : ");
      Serial.println(input[4]);

      //00
      Wire.write(input[5]);
      Wire.write(input[6]);
      Serial.print("Output : ");
      Serial.print(input[5]);
      Serial.println(input[6]);

      delay(15);

      while (Serial.available())
      {
        //Удалим лишние
        Serial.read();
      }
      Wire.endTransmission();
        nChar = 0;
    }
  }

Подчиненный код

#include <Wire.h>
byte ledPins[] = {12, 11, 10, 9, 8, 7, 6};
byte ledPins2[] = {12, 11, 10, 9, 8, 7, 6};
byte count;
byte nChar;
char c;
char input[8];
char data[30] = "";
int n;
#define nBits sizeof(ledPins)/sizeof(ledPins[0])
#define nBits sizeof(ledPins2)/sizeof(ledPins[0])    

void setup()
{
  Wire.begin(1);
  Serial.begin(9600);
  for (byte i = 0; i < nBits; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
for (byte i = 0; i < nBits; i++) {
    pinMode(ledPins2[i], OUTPUT);
    }
  Serial.begin(9600);
}

void loop()
{
  if (nChar < 8) {                    //накапливаем три символа
    if (Serial.available()) {
      c = Serial.read();
      input[nChar++] = c;
    }
  }
  else {
    input[8] = 1;                   //atoi() ожидает признак конца строки
    n = atoi(input);                //конвертируем входные символы в целые числа
    dispBinary(n);
    delay(100);                     //ждём появления дополнительных символов
    while (Serial.available()) {    //игнорируем их
      c = Serial.read();
    }
    nChar = 1;
  }
}    

void receiveEvent(int howMany)
{
  while (1 < Wire.available()) {
    char c = Wire.read();
    Serial.print(c);
  }
}

void dispBinary(int n) //Вертикально
{
  if (n >= 0 && n <= 5) {
    for (byte i = 0; i < nBits; i++) {
      digitalWrite (ledPins[i], n & 1);
      n /= 2;
    }
  }
}

void dispBinary2(int n) //Горизонтально
{
  if (n >= 0 && n <= 5) {
    for (byte i = 0; i < nBits; i++) {
      digitalWrite (ledPins2[i], n & 1);
      n /= 2;
    }
  }

}

void b()
{
  if (data[0] != 'a')
  {
    dispBinary(atoi("00"));
    delay(100);
    dispBinary2(atoi("00"));
    delay(100);
    goto fin;
  }
  if (data[1] = 'x')
  {
    char xdata[2] = {data[2], data[3]};//(данные[2], данные[3]);
    dispBinary2(atoi(xdata));
    delay(100);
  }
  if (data[4] = 'y')
  {
    char ydata[2] = {data[5], data[6]};//(data[5], data[6]);
    dispBinary(atoi(ydata));
    delay(100);
  }

fin:;
}

, 👍0

Обсуждение

Где находится Wire.onRequest?, @Jot


1 ответ


1

Большинство программистов записывают while (1 < Wire.available()) { как while ( Wire.available() > 1) { и читают его «Повторить, пока доступно больше 1 байта». но подождите, зачем оставлять здесь этот один байт? вы хотите «повторить, пока больше нет доступных байтов».

вам нужен while (0 < Wire.available())

,

Какая кодировка, господа?, @Muhammad Nazirul Na'im Maznan

измените while (1 < Wire.available()) на while (0 < Wire.available()), @Juraj

Другой вопрос, почему оно стало на одной линии. Почему бы не сделать одну строку одним выходом. Я не могу разместить изображение, чтобы поделиться с вами. Как сделать ?, @Muhammad Nazirul Na'im Maznan

замените Serial.print(c); на Serial.println(c); ln — это строка, @Juraj