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"
const int buttonPin = 2; // номер входа, подключенный к кнопке //задаём переменные int buttonState = 0; // переменная для хранения состояния кнопки int a = 11; // переменная byte Inputs[8]; // массив, в котором будут храниться данные из 8 байт byte x = 8; // количество байт в массиве void setup() { Serial.begin(9600); // открывает последовательный порт, устанавливает скорость 9600 бит/c Serial.write(Inputs[0], x); } void loop() { }та итить колотить, поставтье наконец-то & перед Inputs.
const int buttonPin = 2; // номер входа, подключенный к кнопке //задаём переменные int buttonState = 0; // переменная для хранения состояния кнопки int a = 11; // переменная byte Inputs[8]={83,76,79,86,79,22,76,84}; // массив, в котором будут храниться данные из 8 байт, записываются в десятичном виде, в мониторе порта отображаются как ASCII-символы byte x = 8; // количество байт в массиве void setup() { Serial.begin(9600); // открывает последовательный порт, устанавливает скорость 9600 бит/c } void loop() { Serial.write(&Inputs[0], x); delay(100); }Превращение значения в адрес, где оно хранится. 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() - старший.
Почему то не могу принять младший байт, пробовал так :
if ( mySerial.available() > 0 ){ a = mySerial.read() + mySerial.read(); Serial.println(a); }Потом пробовал так:
if ( mySerial.available() > 0 ){ mySerial.read(( byte*)&a, sizeof(a));так вообще ругается, может подскажете как правильно, чего то "шарики за ролики уже заехали"...
Такой вопрос функция available, так понимаю по описанию "говорит" сколько байт лежит в буффере? Тогда наверное будет логично if (Serial.availabel() > 2)
Почему то не могу принять младший байт, пробовал так :
if ( mySerial.available() > 0 ){ a = mySerial.read() + mySerial.read(); Serial.println(a); }Не, ну, не так, конечно.
Что-то вроде такого (простите. сейчас проверить не могу, так что мож чего ляпну, но идейно - правильно)
Ну с available там сами разберётесь.
Можно, кончено гораздо проще, если использовать union. Тогда надо наложить два байта на целую перемнную и принимать побайтно. а потом использовать целую.
Ну, если Вы хотите ждать пока оба байта придут. А можно не ждать - читать по одному по мере поступления. Как Вам удобнее.