Обмен данными между ардуино

avgaz
Offline
Зарегистрирован: 23.09.2014

Здравствуйте, подскажите как правильно организовать обменданными в плане вывода данных на второй плате, то есть есть две платы соединенные TX->RX  RX->TX   GND-GND первая плата отсылает данные вторая получает, но как сделать что бы на второй данные были в таком же виде, что и на первой?

вот код платы которая отсылает

float temp1 = 22.50; 
float tempratura = 35.60; 
float set = 40.00;
float temp4 = 56.10;

void setup() {
  Serial2.begin(115200);
}

void loop() {
Serial2.print(temp1);
Serial2.print(",");
Serial2.print(tempratura);
Serial2.print(",");
Serial2.print(set);
Serial2.print(",");
Serial2.print(temp4);
  delay(5000);        
}

Вот примерный код второй платы которая получает

float temp1 = 0; 
float tempratura = 0; 
float set = 0;
float temp4 = 0; 

void setup() {
  Serial.begin(115200);

}

void loop() {
if(Serial.available())
{
temp1 = Serial.read();
Serial.println(temp1);
}

}

Но как сделать что бы переданные данные temp1  tempratura  set   temp4  были тикие же как и посланные??

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

avgaz пишет:

Но как сделать что бы переданные данные temp1  tempratura  set   temp4  были тикие же как и посланные??

надо разобрать принятое, и распихать по переменным. 

avgaz
Offline
Зарегистрирован: 23.09.2014

подскажите наглядно на примере как это сделать? в таком виде как сейчас данные приходят в обще не в том виде что посланы

sadman41
Offline
Зарегистрирован: 19.10.2016

"Serial.ParseFloat() примеры" > Google

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

Если у Вас на исходной плате данные во внутреннем представлении (числа в переменных) и на принимающей плате они должны оказаться тоже во внутреннем представлении, то зачем Вы пре передаче передаёте их как текст? Вот зачем? Чтобы огрести проблем с их распаковкой? Просто передавайте как есть и всё - тогда ничего не надо будет преобразовывать от слова вообще.

b707
Offline
Зарегистрирован: 26.05.2017

avgaz пишет:

подскажите наглядно на примере как это сделать? в таком виде как сейчас данные приходят в обще не в том виде что посланы

Как раз таки они приходят именно в том виде, как посланы. :)

Просто вы их посылаете криво :) - криво они и приходят.

Самый "прямой" способ пересылки. ИМХО - это создать с одной стороны структуру из трех (или сколько там у вас) флоатов, скопировать в нее значения и отправить в Сериал. А на другой ардуине принимать из Сериала именно структуру - тогда вообще ничего распаковывать не нужно будет.

avgaz
Offline
Зарегистрирован: 23.09.2014

b707 пишет:

avgaz пишет:

подскажите наглядно на примере как это сделать? в таком виде как сейчас данные приходят в обще не в том виде что посланы

Как раз таки они приходят именно в том виде, как посланы. :)

Просто вы их посылаете криво :) - криво они и приходят.

Самый "прямой" способ пересылки. ИМХО - это создать с одной стороны структуру из трех (или сколько там у вас) флоатов, скопировать в нее значения и отправить в Сериал. А на другой ардуине принимать из Сериала именно структуру - тогда вообще ничего распаковывать не нужно будет.

Покажите наглядно как это правильно сделать плиз

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

avgaz пишет:

Покажите наглядно как это правильно сделать плиз

Блин, ну я же написал - посылайте как есть безо всякого преобразования в текст.

В моём примере структура сделана для удобства, можно и без неё. И серисал у меня один, потому я просто проверяю правильнсоть (зная, что передавал) и мигаю светодиодом, что мол "всё окей"

Передатчик 

//
//	Формируем всё, что надо передавать
//	в единый "пакет для передачи"
//
struct Package {
	int temp1; 
	int tempratura; 
	int set;
	int temp4;
} package;

void setup() {
	package.temp1 = 1; 
	package.tempratura = 2; 
	package.set = 3;
	package.temp4 = 4;
	Serial.begin(9600);
}

void loop() {
	// Передаём
	Serial.write((uint8_t *) & package, sizeof(package));
	delay(1000);
}

Приёмник

//
//	Формируем всё, что надо прниять
//	в единый "пакет для приёма"
//	Он должен в точности совпадать с пакетом передачи
//
struct Package {
	int temp1; 
	int tempratura; 
	int set;
	int temp4;
} package;

void setup() {
	Serial.begin(9600);
	pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
	// Ждём пока всё придёт
	if (Serial.available() < (int) sizeof(package)) return;
	// принимаем
	Serial.readBytes((uint8_t *) & package, sizeof(package));
	//
	// проверяем
	if (package.temp1 == 1 && package.tempratura == 2 && package.set == 3  && package.temp4 == 4) {
		digitalWrite(LED_BUILTIN, HIGH);
		delay(50);
		digitalWrite(LED_BUILTIN, LOW);
	}
}

Нормально мигает раз в секунду, значит всё принимает правильно.

sadman41
Offline
Зарегистрирован: 19.10.2016

А синхронизация, а CRC... Он же щас это на газовый котел прикрутит...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

А синхронизация, а CRC... Он же щас это на газовый котел прикрутит...

Ну, значить, пополнит нашу колонию на Марсе. 

avgaz
Offline
Зарегистрирован: 23.09.2014

ЕвгенийП пишет:

avgaz пишет:

Покажите наглядно как это правильно сделать плиз

Блин, ну я же написал - посылайте как есть безо всякого преобразования в текст.

В моём примере структура сделана для удобства, можно и без неё. И серисал у меня один, потому я просто проверяю правильнсоть (зная, что передавал) и мигаю светодиодом, что мол "всё окей"

Нормально мигает раз в секунду, значит всё принимает правильно.

Проробовал как вы показали в результате Serial.println(package.tempratura); в место 2 печатает 262147

вот код обоих плат

struct Package {
  int temp1; 
  int tempratura; 
  int set;
  int temp4;
} package;

void setup() {
  package.temp1 = 1; 
  package.tempratura = 2; 
  package.set = 3;
  package.temp4 = 4;
  Serial2.begin(115200);
}

void loop() {
Serial2.write((uint8_t *) & package, sizeof(package));
  delay(1000);
        
}

приемник

struct Package {
  int temp1; 
  int tempratura; 
  int set;
  int temp4;
} package; 

void setup() {
  Serial.begin(115200);

}

void loop() {
  
if (Serial.available() < (int) sizeof(package)) return;
  // принимаем
  Serial.readBytes((uint8_t *) & package, sizeof(package));


Serial.println(package.tempratura);


}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А что именно у Вас подключено к Serial приемника?

И еще: какие именно модели Ардуино Вы используете в качестве передатчика и приемника?

avgaz
Offline
Зарегистрирован: 23.09.2014

andriano пишет:

А что именно у Вас подключено к Serial приемника?

И еще: какие именно модели Ардуино Вы используете в качестве передатчика и приемника?

передатчик Mega приемник NodeMCU к котрой по tx-rx подключена мега и по usb к ПК для монтора порта

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

avgaz пишет:

Проробовал как вы показали в результате Serial.println(package.tempratura); в место 2 печатает 262147

Ну, мой-то пример у Вас заработал?

А Ваш - так пишите нормально. Вы в приёмнике используете один и тот же Serial и для приёма с другой ардуины, и для монитора порта.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Так чего ж Вы хотите, если передаете одно, а принять пытаетесь совсем другое?

В языке Си не стандартизована длина типа int, соответственно, на разных платформах он может иметь различную длину.

Выведите каждым из контроллеров на печать величину sizeof(int) и подумайте над результатом.

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

avgaz пишет:

передатчик Mega приемник NodeMCU 

Одна 8-миразрядная, а другая 32-х? Замечательно! Тогда переделайте структуру, чтобы поля были одного размрера.

Но моё замечание о том, что на сериале сидят и монитор и передача тоже никто не отменяет.

avgaz
Offline
Зарегистрирован: 23.09.2014

andriano пишет:

Так чего ж Вы хотите, если передаете одно, а принять пытаетесь совсем другое?

В языке Си не стандартизована длина типа int, соответственно, на разных платформах он может иметь различную длину.

Выведите каждым из контроллеров на печать величину sizeof(int) и подумайте над результатом.

по этому я и прошу помочь сделать передачу данных ((

avgaz
Offline
Зарегистрирован: 23.09.2014

ЕвгенийП пишет:

avgaz пишет:

Проробовал как вы показали в результате Serial.println(package.tempratura); в место 2 печатает 262147

Ну, мой-то пример у Вас заработал?

А Ваш - так пишите нормально. Вы в приёмнике используете один и тот же Serial и для приёма с другой ардуины, и для монитора порта.

Проробовал как вы показали в результате Serial.println(package.tempratura); в место 2 печатает 262147

 

b707
Offline
Зарегистрирован: 26.05.2017

avgaz пишет:

по этому я и прошу помочь сделать передачу данных ((

В каком виде помочь? Вам тут столько советов накидали, даже примеры кода дали. Попробуйте хоть чуть-чуть разобраться в них. Или вы ждете. что вам вашу передачу от начала и до конца кто-то напишет?
Даже если и найдется такой доброжелатель - дальше-то что? будет у вас связь между ардуинами, а остальной код кто писать будет. если вы в простейших вещах не разбираетесь?

avgaz
Offline
Зарегистрирован: 23.09.2014

b707 пишет:

avgaz пишет:

по этому я и прошу помочь сделать передачу данных ((


Даже если и найдется такой доброжелатель - дальше-то что? будет у вас связь между ардуинами, а остальной код кто писать будет. если вы в простейших вещах не разбираетесь?

остальной код уже есть и давно работает, просто вышел из сторя шилд w5100 на котором был вебсервер с данными и которы по lan был подключен к роутеру который в свою очеред по wifi подключался к домашней сети. Вот в наличии имеется платка NodeMCU V3 вот и решил сделать без всяких роутеров и w5100, а разу она подключается к домашней сети, поднял вебсервер перенес страничку, а вот данные с меги не получается передать (((

b707
Offline
Зарегистрирован: 26.05.2017

avgaz пишет:

остальной код уже есть и давно работает, просто вышел из сторя шилд w5100 на котором был вебсервер с данными и которы по lan был подключен к роутеру который в свою очеред по wifi подключался к домашней сети. Вот в наличии имеется платка NodeMCU V3 вот и решил сделать без всяких роутеров и w5100, а разу она подключается к домашней сети, поднял вебсервер перенес страничку, а вот данные с меги не получается передать (((

ну ежели все перечисленное вы осилили - то вам не составит труда разобраться, как передать три числа по Сериал. информации в предыдущих сообщения более чем достаточно.

Ну или ждите "доброжелателя".

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

avgaz пишет:

по этому я и прошу помочь сделать передачу данных ((

Какой именно помощи Вы ждёте?

Вы просили "показать наглядно", Вам дали нормально работающий на двух одинаковых ардуинах код.

А когда выяснилось, что у Вас оказывается не две ардуины, а ардуина и NodeMCU, Вам сразу два человека написали, что делать, чтобы код заработал и в этом случае

andriano пишет:

Так чего ж Вы хотите, если передаете одно, а принять пытаетесь совсем другое?

В языке Си не стандартизована длина типа int, соответственно, на разных платформах он может иметь различную длину.

Выведите каждым из контроллеров на печать величину sizeof(int) и подумайте над результатом.

ЕвгенийП пишет:

Одна 8-миразрядная, а другая 32-х? Замечательно! Тогда переделайте структуру, чтобы поля были одного размрера. Но моё замечание о том, что на сериале сидят и монитор и передача тоже никто не отменяет.

Какой ещё помощи Вам надо? Что ещё можно для Вас сделать?

 
avgaz
Offline
Зарегистрирован: 23.09.2014

ЕвгенийП пишет:

Какой ещё помощи Вам надо? Что ещё можно для Вас сделать?

просто рабочий пример, передачи данных, как переделать структуру что бы поля были одинаковые?

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

Я Вам дал рабочий пример. Не я виноват в том, что Вы не написали, что у Вас разные контроллеры. Написали бы, пример был бы под них. Писать для Вас ещё один пример мне уже лень, извините. Ответить на Ваш вопрос могу

avgaz пишет:
как переделать структуру что бы поля были одинаковые?

Передавать точно также (для альтернативно одарённых - точно также) как и в моём примере. Просто описать структуры так, чтобы все поля в них были одинаковго размера (и убедиться в этом - как убедиться Вам Andriano написал).

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Мужик, кончай тупить. Возьми тот пример: на стороне NODE ничего не меняй, а на стророне ардуины замени все int на long и будет тебе щастье. И, да, почитай чёнить про программирование, чтобы клоуном-то не быть.

avgaz
Offline
Зарегистрирован: 23.09.2014

Ворота пишет:

Мужик, кончай тупить. Возьми тот пример: на стороне NODE ничего не меняй, а на стророне ардуины замени все int на long и будет тебе щастье. И, да, почитай чёнить про программирование, чтобы клоуном-то не быть.

Спасибо, вроде что то начало получатся только в этом случае передаются целы числа как быть если нужно передать например 22.56

b707
Offline
Зарегистрирован: 26.05.2017

avgaz пишет:

Спасибо, вроде что то начало получатся только в этом случае передаются целы числа как быть если нужно передать например 22.56

решение "влоб" для тех, кто не хочет копать теорию - перед передачей домножить на 100, после - разделить.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Госспадя, откуда вы такие беретесь, с ниточкоймежду ушей. 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

avgaz пишет:
как быть если нужно передать например 22.56

Ты моё сообщение до конца прочитал? Там был ответ на этот вопрос

Ворота пишет:
почитай чёнить про программирование, чтобы клоуном-то не быть.

Вот так и быть. А ты думал как-то по-другому?

Ты просил пример - тебе дали. Работает? Работает! Теперь тебе на float надо? А потом на String? Пример есть - делай по образу и подобию. Должен же ты хоть что-то сам сделать.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Как-то слова о поднятом сервере и перенесенной страничке воспринимаюца теперь с изрядной долей недоверия.

Или для web-пограммистов это намайна?

avgaz
Offline
Зарегистрирован: 23.09.2014

Ворота пишет:

Ты просил пример - тебе дали. Работает? Работает! Теперь тебе на float надо? А потом на String? Пример есть - делай по образу и подобию. Должен же ты хоть что-то сам сделать.

Да во float все норм стало.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

DetSimen пишет:

Или для web-пограммистов это намайна?

Деда, поверь личному опыту: там творится кромешный пи@дец: амбиций - на зарплату в сотню тысяч, знаний - нихера. Начинаешь спрашивать про обычные приёмы, типа декомпозиции - в ответ выпученные глазки и вопрос "а что это?". Там в пустоголовках одни фреймворки, теорию учить не нать. Ремесло, хуле.