call of overloaded write is ambiguous
- Войдите на сайт для отправки комментариев
Чт, 26/05/2016 - 13:50
Только начал программировать. Пока написал только вот это.
const int buttonPin = 2; // номер входа, подключенный к кнопке //задаём переменные int buttonState = 0; // переменная для хранения состояния кнопки int a = 11; // переменная word Inputs[8]; // массив, в котором будут храниться данные из 8 байт void setup() { Serial.begin(9600); // открывает последовательный порт, устанавливает скорость 9600 бит/c Serial.write(Inputs[0], 8); } void loop() { }
Компилятор указывает на строку Serial.write и пишет "call of overloaded 'write(word&, int)' is ambiguous".
Если убрать из скобок размер массива, и написать Serial.write(Inputs[0]); то компилятор это съедает. Но хотелось бы понять как передавать массив байтов.
for (byte i = 0; i < 8; i++) { Serial.write(Inputs[i]); }
А чтобы понять, надо почитать описание Serial.write.
Вы предлагаете передавать данные побайтно?
Вот описание функции Serial.write: http://arduino.ru/Reference/Serial/Write
"Данные послаются как один или серия байтов"
Мне нужно послать все данные массива, т.е. как серию байтов.
а они внутри функции всё равно побайтно передадутся. так что это полный аналог. но если очень хочется так, то вот так.
Serial
.write(&Inputs[0], 8);
Пишет no matching function for call to 'HardwareSerial::write(word*, int)'
Пишет no matching function for call to 'HardwareSerial::write(word*, int)'
Ну и правильно пишет. Если у Вас массив байтов, так нафига Вы его обозвали word в 6-ой строке? Пишите byte
Обозвал. Снова пишет "call of overloaded 'write(byte&, byte&)' is ambiguous"
та итить колотить, поставтье наконец-то & перед Inputs.
Превращение значения в адрес, где оно хранится. Inputs -- массив, то бишь адрес начала хранения теперь байтиков в количестве 8 шт. Квадратные скобки и чиселко в них: [0] -- указание взять ЗНАЧЕНИЕ, лежащее в нулевом байтике от начала (адреса) "Inputs". А Вам надо передать в функцию не значение а адрес .. вот унарная операция & и возвращает адрес места хранения указанного значения. Правильно прочитав вышеизложенное, можно поступать "двояко":
1.
Serial
.write(&(Inputs[0]), x);
-- получить адрес элемента массива (не обязательно 0..)2.
Serial
.write(Inputs, x); -- сам Inputs является адресом нулевого элемента массива (но только 0)..
Нашел Вашу тему.
Помогите разрешить проблему. Задача в следующем, необходимо передать значение температуры (float с 2-мя знаками после запятой) с одной ардуины на другую по UART, получается какая-то "чушь". При передаче в Serial.write значения температуры пишет, что тип float, не может передаваться. Float умножаю на 100 Перевожу в тип int (т.е 2 байта)получаю 4-х значное число, отсылаю Serial.write, на приемной стороне не получаю полную чушь. Методом проб и ошибок "вкурил", что у меня принимается только 1 байт, причем последний. Подскажите как передавать и соответственно получать через UART больше 1-го байта.
Исходный код для передатчика:
STemp_eng = 256 ; // я уже на "бубликах" пробую, не получается
Обязательно прочитайте http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Serial.write(STemp_eng); // вроде должно уходить именно 256
Перешлётся STemp_eng целиком, будь она хоть int, хоть double.
Спасибо буду пробовать...
Не пойму формат функции (передачи), а как ловить на приеме, чего то не получается. Пишет 0. Все варианты перепробовал и Serial.read и Serial.readByte (вообще ругается), пробовал вариант из этого топика. Может байты надо отдельно собирать в массив, а затем суммировать? Если не сложно можете подсказать...
Так если передаёте два байта, так и читайте два. Первый read() даст Вам младший байт, а второй read() - старший.
Почему то не могу принять младший байт, пробовал так :
Потом пробовал так:
так вообще ругается, может подскажете как правильно, чего то "шарики за ролики уже заехали"...
Такой вопрос функция available, так понимаю по описанию "говорит" сколько байт лежит в буффере? Тогда наверное будет логично if (Serial.availabel() > 2)
Почему то не могу принять младший байт, пробовал так :
Не, ну, не так, конечно.
Что-то вроде такого (простите. сейчас проверить не могу, так что мож чего ляпну, но идейно - правильно)
Ну с available там сами разберётесь.
Можно, кончено гораздо проще, если использовать union. Тогда надо наложить два байта на целую перемнную и принимать побайтно. а потом использовать целую.
Ну, если Вы хотите ждать пока оба байта придут. А можно не ждать - читать по одному по мере поступления. Как Вам удобнее.