Wire.h проводная передача данных

Тема в разделе "Проводная и беспроводная связь", создана пользователем rman, 22 июл 2015.

  1. rman

    rman Нуб

    Здравствуйте.
    Использую библиотеку Wire.h для передачи данных между двумя Uno.
    Мастер запрашивает 32 бита байта.
    Слейв их передает.

    Эта схема, этот код:
    https://www.arduino.cc/en/Tutorial/MasterReader

    Но почему то в строке принимается корректно только первые 5 символов - дальше каша.

    При этом передаю как заготовленную строку, так и различную "составную" комбинацию переменных. Но корректны только первые 6 символов.

    Например передаю:
    T1234567T1234567T1234567T1234567

    Принимает:
    T1234ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ

    В примере запрашивается 6 символов. Может это какое-то ограничение?
    Хотя буфер в библиотеке по умолчанию 32 бита байта.
     
    Последнее редактирование: 22 июл 2015
  2. 32 бита это 4 байта
     
  3. rman

    rman Нуб

    Ух. Прошу прощения. Конечно речь везде про 32 бАйта.
     
  4. Vad33

    Vad33 Капитан-оригинал

    В этом примере написано буквально следующее:
    Код (Text):
    Wire.requestFrom(2, 6);    // request 6 bytes from slave device #2
    Пробовали менять значение?
    .
     
    Последнее редактирование: 22 июл 2015
  5. rman

    rman Нуб

    Длина проводов - 10 см. Лежат рядом (установлены будут также).

    Да. Значение сразу поменял на 20.
    И принимало 20 символов (в том числе непонятных).
    Потом ставил 6. Тогда принимает только первые 6.
    Потом ставил 40. Тогда принимает 32.
    Потом ставил 32. Тогда тоже 32.
     
  6. rman

    rman Нуб

    Вот кусок кода из слэйва:
    Код (Text):
    String msg;
      void requestEvent()
    {
    char out[sizeof(msg)];
      msg.toCharArray(out, sizeof(msg));                  
      Wire.write(out);
      Serial.println(msg);
    }
    msg="q1234567890987654321";
    Вот кусок кода из мастера:
    Код (Text):
    Wire.requestFrom(2, 32);
        String msg = "";
        while(Wire.available())
        {
          char c = Wire.read();
          msg = msg + c;
        }
        Serial.println(msg);
    И вот такую штуку он принимает:
    Как так?
     
  7. rman

    rman Нуб

    Решено. Не верно пытался узнать длину строки.
    Вместо неверного
    Код (Text):
    char out[sizeof(msg)];
      msg.toCharArray(out, sizeof(msg));
    Необходимо использовать
    Код (Text):
    char out[msg.length()];
      msg.toCharArray(out, msg.length());