call of overloaded write is ambiguous

Stalevik
Offline
Зарегистрирован: 26.05.2016

Только начал программировать. Пока написал только вот это.

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]); то компилятор это съедает. Но хотелось бы понять как передавать массив байтов.
Araris
Offline
Зарегистрирован: 09.11.2012

for (byte i = 0; i < 8; i++) { Serial.write(Inputs[i]); }

А чтобы понять, надо почитать описание Serial.write.

Stalevik
Offline
Зарегистрирован: 26.05.2016

Вы предлагаете передавать данные побайтно?

Вот описание функции Serial.write: http://arduino.ru/Reference/Serial/Write

"Данные послаются как один или серия байтов"

Мне нужно послать все данные массива, т.е. как серию байтов.

__Alexander
Offline
Зарегистрирован: 24.10.2012

а они внутри функции всё равно побайтно передадутся. так что это полный аналог. но если очень хочется так, то вот так.

Serial.write(&Inputs[0], 8); 

 

 

Stalevik
Offline
Зарегистрирован: 26.05.2016

Пишет  no matching function for call to 'HardwareSerial::write(word*, int)'

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Stalevik пишет:

Пишет  no matching function for call to 'HardwareSerial::write(word*, int)'

Ну и правильно пишет. Если у Вас массив байтов, так нафига Вы его обозвали word в 6-ой строке? Пишите byte

Stalevik
Offline
Зарегистрирован: 26.05.2016

Обозвал. Снова пишет "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() {               
}

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

та итить колотить, поставтье наконец-то & перед Inputs.

Stalevik
Offline
Зарегистрирован: 26.05.2016
Ура! Скомпилировалось! Спасибо.
 
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? Не могу нагуглить.
Я поставил задержку 100мс чтобы было видно мигание светодиода (иначе он просто горит при постоянной передаче, и не понятно передаются данные или нет).
Не могу понять- почему данные шлются сразу в UART и USB? Видно мигание светодиода подключённого к TX, и также на монитор порта приходят последовательности байт.
Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Превращение значения в адрес, где оно хранится. Inputs -- массив, то бишь адрес начала хранения теперь байтиков в количестве 8 шт.  Квадратные скобки и чиселко в них: [0] -- указание взять ЗНАЧЕНИЕ, лежащее в нулевом байтике от начала (адреса) "Inputs". А Вам надо передать в функцию не значение а адрес .. вот унарная операция & и возвращает адрес места хранения указанного значения. Правильно прочитав вышеизложенное, можно поступать "двояко":

1. Serial.write(&(Inputs[0]), x); -- получить адрес элемента массива (не обязательно 0..)

2. Serial.write(Inputs, x); -- сам Inputs является адресом нулевого элемента массива (но только 0)..

Valant
Offline
Зарегистрирован: 27.05.2016

Нашел Вашу тему.

Помогите разрешить проблему. Задача в следующем, необходимо передать значение температуры (float с 2-мя знаками после запятой) с одной ардуины на другую по UART, получается какая-то "чушь". При передаче в Serial.write значения температуры пишет, что тип float, не может передаваться. Float умножаю на 100 Перевожу в тип int (т.е 2 байта)получаю 4-х значное число, отсылаю Serial.write, на приемной стороне не получаю полную чушь. Методом проб и ошибок "вкурил", что у меня принимается только 1 байт, причем последний. Подскажите как передавать и соответственно получать через UART больше 1-го байта. 

Исходный код для передатчика:

STemp_eng = 256 ; // я уже на "бубликах" пробую, не получается 

Serial.write(STemp_eng);  // вроде должно уходить именно 256
 
код для приемника:
if (Serial.available() > 0)
int Temp_eng = Serial.read();
 
пробовал так:
int Temp_eng[2];
void setup()
{
Serial.begin(9600);
}
void loop()
{
 
if (Serial.available() > 0){
Serial.readBytes(Temp_eng, 2);
 Serial.println(Temp_eng);
}
Дкмаю не должно быть очень громоздко при получении 2-х и более  байтов.
По идее должна быть функция которая бы собирала байты воедино и представляла как единое значение...
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Обязательно прочитайте http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

Valant пишет:

Serial.write(STemp_eng);  // вроде должно уходить именно 256

 
Не должно. В таком виде write шлёт ровно 1 байт.
 
Если хотите переслать int (или, кстати, float - тоже можно), используйте форму
Serial.write((byte *) & STemp_eng, sizeof(STemp_eng));

Перешлётся STemp_eng целиком, будь она хоть int, хоть double.

 

Valant
Offline
Зарегистрирован: 27.05.2016

Спасибо буду пробовать...

Valant
Offline
Зарегистрирован: 27.05.2016

Не пойму формат функции (передачи), а как ловить на приеме, чего то не получается. Пишет 0. Все варианты перепробовал и Serial.read и Serial.readByte (вообще ругается), пробовал вариант из этого топика. Может байты надо отдельно собирать в массив, а затем суммировать? Если не сложно можете подсказать...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так если передаёте два байта, так и читайте два. Первый read() даст Вам младший байт, а второй read() - старший.

Valant
Offline
Зарегистрирован: 27.05.2016

Почему то не могу принять младший байт, пробовал так :

if (  mySerial.available() > 0  ){
    
     a = mySerial.read() + mySerial.read();
  
     Serial.println(a);
   }

Потом пробовал так:



if (  mySerial.available() > 0 ){
     mySerial.read(( byte*)&a, sizeof(a));

так вообще ругается, может подскажете как правильно, чего то "шарики за ролики уже заехали"...

Valant
Offline
Зарегистрирован: 27.05.2016

Такой вопрос функция available, так понимаю по описанию "говорит" сколько байт лежит в буффере? Тогда наверное будет логично if (Serial.availabel() > 2)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Valant пишет:

Почему то не могу принять младший байт, пробовал так :

if (  mySerial.available() > 0  ){
    
     a = mySerial.read() + mySerial.read();
  
     Serial.println(a);
   }

Не, ну, не так, конечно.

Что-то вроде такого (простите. сейчас проверить не могу, так что мож чего ляпну, но идейно - правильно)

int rec;
...
rec = Serial.read(); // принимаем младший байт
...
*(((byte *) & rec) + 1) = Serial.read(); // принимаем старший байт

Ну с available там сами разберётесь.

Можно, кончено гораздо проще, если использовать union. Тогда надо наложить два байта на целую перемнную и принимать побайтно. а потом использовать целую. 

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Valant пишет:
Такой вопрос функция available, так понимаю по описанию "говорит" сколько байт лежит в буффере? Тогда наверное будет логично if (Serial.availabel() > 2)

Ну, если Вы хотите ждать пока оба байта придут. А можно не ждать - читать по одному по мере поступления. Как Вам удобнее.