Здравствуйте. Использую библиотеку Wire.h для передачи данных между двумя Uno. Мастер запрашивает 32 бита байта. Слейв их передает. Эта схема, этот код: https://www.arduino.cc/en/Tutorial/MasterReader Но почему то в строке принимается корректно только первые 5 символов - дальше каша. При этом передаю как заготовленную строку, так и различную "составную" комбинацию переменных. Но корректны только первые 6 символов. Например передаю: T1234567T1234567T1234567T1234567 Принимает: T1234ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ В примере запрашивается 6 символов. Может это какое-то ограничение? Хотя буфер в библиотеке по умолчанию 32 бита байта.
В этом примере написано буквально следующее: Код (Text): Wire.requestFrom(2, 6); // request 6 bytes from slave device #2 Пробовали менять значение? .
Длина проводов - 10 см. Лежат рядом (установлены будут также). Да. Значение сразу поменял на 20. И принимало 20 символов (в том числе непонятных). Потом ставил 6. Тогда принимает только первые 6. Потом ставил 40. Тогда принимает 32. Потом ставил 32. Тогда тоже 32.
Вот кусок кода из слэйва: Код (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); И вот такую штуку он принимает: Как так?
Решено. Не верно пытался узнать длину строки. Вместо неверного Код (Text): char out[sizeof(msg)]; msg.toCharArray(out, sizeof(msg)); Необходимо использовать Код (Text): char out[msg.length()]; msg.toCharArray(out, msg.length());