#1 2020-02-25 00:22:36

khalimon
Учасник
Зареєстрований: 2020-02-24
Повідомлень: 19

Глюк связи двух ардуино нано

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

Код на принимающей ардуинке, которая есть индикация
if (millis()-tim>500) {
                       
                       SerialREAD ();//чтение данных с силовой платы 1 раз в  0.5c
                       tim=millis();
                     
                        }
.......................................


void SerialREAD (){

if (!Serial.available()) return;

timeHour1 = Serial.parseInt ();
timeMin1 = Serial.parseInt ();
temperatura1 = Serial.parseInt ();
start = Serial.parseInt ();


}


Ниже код с передающей ардуинки (силовая плата)

if ( millis()-ms8>500) {
                               Serial.println(timeHour);
                               Serial.println(timeMin);
                               Serial.println(t);
                               Serial.println(start);

ms8=millis();
                }


В этом виде вроде как работает, Но:
- в течении 10-15минут происходит сдвиг принимаемых данных, соответственно переменные получают неправильные значения.
- если убрать или изменить  периодичность опроса буфера приёма  относительно передающей платы, то принимающая начинает сильно тормозить (даже кнопки нажать затруднительно).
- пробовал  serialEvent - вообще висит!!
- пробовал флаги посылать и буфер чистить flush () - ничего не изменилось - ч/з время опять сдвиг
Это мой третий более менее серьёзный проект, прошу помощи в реализации стабильного обмена данными между ардуинками.

Остання редакція khalimon (2020-02-25 00:24:34)

Неактивний

#2 2020-02-25 00:49:21

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 874

Re: Глюк связи двух ардуино нано

rs485

Неактивний

#3 2020-02-25 08:55:38

YK
Гість

Re: Глюк связи двух ардуино нано

Передавай данные одним пакетом например для простоты в одной строке с разделением "," или ";" и терминатор в конце например ":"
String toSend=String(timeHour)+";"+String(timeMin)+.....":";


ну и на приемнике

String data = Serial.readStringUntil(":");
 char *p = data.c_str() ;
 char *str;
int incomeint[5];
int i=0;
 while ((str = strtok_r(p, ";", &p)) != NULL){ // delimiter is the semicolon
   Serial.println(str);
    incomeint[i]=str.toInt();
    i++;
}

как то так , incomeint  будет содержать твои данные,

#4 2020-02-25 09:46:02

khalimon
Учасник
Зареєстрований: 2020-02-24
Повідомлень: 19

Re: Глюк связи двух ардуино нано

vvr пише:

rs485

Расстояние всего 50см. rs485 действительно улучшит ситуацию?

Неактивний

#5 2020-02-25 09:57:08

khalimon
Учасник
Зареєстрований: 2020-02-24
Повідомлень: 19

Re: Глюк связи двух ардуино нано

YK пише:

Передавай данные одним пакетом например для простоты в одной строке с разделением "," или ";" и терминатор в конце например ":"
String toSend=String(timeHour)+";"+String(timeMin)+.....":";


ну и на приемнике

String data = Serial.readStringUntil(":");
 char *p = data.c_str() ;
 char *str;
int incomeint[5];
int i=0;
 while ((str = strtok_r(p, ";", &p)) != NULL){ // delimiter is the semicolon
   Serial.println(str);
    incomeint[i]=str.toInt();
    i++;
}

как то так , incomeint  будет содержать твои данные,

я пробовал отправлять разделительный символ-результата не было. Отличие у меня было только в том, что передавал с переносом каретки:

Serial.println('s');             
Serial.println(timeHour);
Serial.println(timeMin);
Serial.println(t);
Serial.println(start);

на приёме
с=Serial.read();
if (c=='s') {
timeHour1 = Serial.parseInt ();
timeMin1 = Serial.parseInt ();
temperatura1 = Serial.parseInt ();
start = Serial.parseInt ();}
                                  else Serial.flush ();

Будет ли разница при передачи строки? В любом случае попробую варианты... Спасибо!

Неактивний

#6 2020-02-25 11:23:05

YK
Гість

Re: Глюк связи двух ардуино нано

khalimon пише:
YK пише:

Передавай данные одним пакетом например для простоты в одной строке с разделением "," или ";" и терминатор в конце например ":"
String toSend=String(timeHour)+";"+String(timeMin)+.....":";


ну и на приемнике

String data = Serial.readStringUntil(":");
 char *p = data.c_str() ;
 char *str;
int incomeint[5];
int i=0;
 while ((str = strtok_r(p, ";", &p)) != NULL){ // delimiter is the semicolon
   Serial.println(str);
    incomeint[i]=str.toInt();
    i++;
}

как то так , incomeint  будет содержать твои данные,

я пробовал отправлять разделительный символ-результата не было. Отличие у меня было только в том, что передавал с переносом каретки:

Serial.println('s');             
Serial.println(timeHour);
Serial.println(timeMin);
Serial.println(t);
Serial.println(start);

на приёме
с=Serial.read();
if (c=='s') {
timeHour1 = Serial.parseInt ();
timeMin1 = Serial.parseInt ();
temperatura1 = Serial.parseInt ();
start = Serial.parseInt ();}
                                  else Serial.flush ();

Будет ли разница при передачи строки? В любом случае попробую варианты... Спасибо!

Ну это не весь код. Возможно в Serial на передатчике еще кто то пишет, посмотри монитором передатчик.
В любом случае передача все строки надежней ты можешь ее выделить даже как-то. соответственно  ты будешь получать только гарантированные валидные пакеты

#7 2020-02-25 12:16:31

khalimon
Учасник
Зареєстрований: 2020-02-24
Повідомлень: 19

Re: Глюк связи двух ардуино нано

YK пише:

Ну это не весь код. Возможно в Serial на передатчике еще кто то пишет, посмотри монитором передатчик.
В любом случае передача все строки надежней ты можешь ее выделить даже как-то. соответственно  ты будешь получать только гарантированные валидные пакеты

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

Неактивний

#8 2020-02-25 13:05:34

YK
Гість

Re: Глюк связи двух ардуино нано

khalimon пише:
YK пише:

Ну это не весь код. Возможно в Serial на передатчике еще кто то пишет, посмотри монитором передатчик.
В любом случае передача все строки надежней ты можешь ее выделить даже как-то. соответственно  ты будешь получать только гарантированные валидные пакеты

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


Будет работать. Дело в том что со строкой можно еще ввести контрольные суммы и т.п. Т.е. если пару пакетов  заглючат, ты их просто проигнорируешь, думаю это не принципиально. зато всегда будешь получать гарантированные данные

#9 2020-02-25 14:08:16

khalimon
Учасник
Зареєстрований: 2020-02-24
Повідомлень: 19

Re: Глюк связи двух ардуино нано

YK пише:

Передавай данные одним пакетом например для простоты в.....

Не могу помять, где ошибка?
Пишет:
request for member 'toInt' in 'str', which is of non-class type 'char*'
ругается на строки синего цвета...
Переменные timeHour1,timeMin1,t, start - у меня обозначены как int. Не могу понять где ошибка??

void SerialREAD (){

if (!Serial.available()) return;
String data = Serial.readStringUntil(":");
char *p = data.c_str() ;
char *str;

int i=0;

while ((str = strtok_r(p, ";", &p)) != NULL){
 
   switch (i)
   case 0:
     timeHour1 = str.toInt();
   break;
   case 1:
     timeMin1 = str.toInt();
   break;
   case 2:
    t = str.toInt();
   break;
   case 3:
    start = str.toInt();
   break;
   
    i++;
}

Остання редакція khalimon (2020-02-25 14:12:03)

Неактивний

#10 2020-02-25 14:42:40

YK
Гість

Re: Глюк связи двух ардуино нано

char *str;  это char*


Сделай
String myStr=str;

затем используй
myStr.toInt();

моя ошибка в первом примере , я просто наводку давал

#11 2020-02-25 15:18:14

khalimon
Учасник
Зареєстрований: 2020-02-24
Повідомлень: 19

Re: Глюк связи двух ардуино нано

YK пише:

char *str;  это char*


Сделай
String myStr=str;

затем используй
myStr.toInt();

моя ошибка в первом примере , я просто наводку давал


Запустил ваш вариант - висит ни на что не реагирует....
Чувство, что цикл while висит...
Вот приёмник:
if (millis()-tim>500) {
                       
                       SerialREAD ();//чтение данных с силовой платы 1 раз в 
                       tim=millis();
                     
                        }

....................................

void SerialREAD (){

if (!Serial.available()) return;

String data = Serial.readStringUntil(":");
char *p = data.c_str() ;
char *str;
String myStr=str;
int i=0;

while ((str = strtok_r(p, ";", &p)) != NULL){
 
   switch (i){
   case 0:
     timeHour1 = myStr.toInt();
   break;
   case 1:
     timeMin1 = myStr.toInt();
   break;
   case 2:
    temperatura1 = myStr.toInt();
   break;
   case 3:
    start = myStr.toInt();
   break;
   
    i++;
            }

}

if (start==5) {flagdisplay=4; zvuk=1;start=0;}   

}



Ниже передатчик

if ( millis()-ms8>500) {

if (start==5) {a='5';start=0;} else a = String(start);
StringtoSend=String(timeHour)+";"+String(timeMin)+";"+String(t)+";"+a+":";
Serial.println(StringtoSend);
ms8=millis();
}

Неактивний

#12 2020-02-25 15:49:31

khalimon
Учасник
Зареєстрований: 2020-02-24
Повідомлень: 19

Re: Глюк связи двух ардуино нано

YK пише:

Будет работать. Дело в том что со строкой можно еще ввести контрольные суммы и т.п. Т.е. если пару пакетов  заглючат, ты их просто проигнорируешь, думаю это не принципиально. зато всегда будешь получать гарантированные данные

Если ваш вариант заработает - готов кинуть 200грн(только если вы с Украины), поэтому прошу помочь довести до конца эту часть кода...

Неактивний

#13 2020-02-25 21:26:34

khalimon
Учасник
Зареєстрований: 2020-02-24
Повідомлень: 19

Re: Глюк связи двух ардуино нано

Вообщем сделал в одну строку приём/передачу - получасовой режим отработал впервые до конца. Но всё же успел на табло увидеть разовый глюк, на работу он не отразился,но всё же присутствовал.  Теперь думаю , что контрольную сумму всё же придется использовать.
Ниже мой рабочий текущий вариант

передатчик
if ( millis()-ms8>500) {
if (start==5) {a='5';start=0;}else a = String(start);
StringtoSend=String(timeHour)+";"+String(timeMin)+";"+String(t)+";"+a+":";
Serial.println(StringtoSend);
ms8=millis();        }

приемник

void SerialREAD (){
if (!Serial.available()) return;
String data = Serial.readStringUntil('\n');
str1="";
rr=0;
le=data.length();
for (int qq=0; qq<=le;qq++) {
if (data[qq]==';' || data[qq]==':') {
  switch (rr) {
    case 0:
    timeHour1 = str1.toInt();
     break;
     
    case 1:
    timeMin1 = str1.toInt();
     break;
     
    case 2:
    temperatura1 = str1.toInt();
     break;
     
    case 3:
    start = str1.toInt();
    if (start==5) {flagdisplay=4; zvuk=1;start=0;}
     break;

  }
  rr++;
  str1="";
  }
    else str1=str1+data[qq];

   }

}

Остання редакція khalimon (2020-02-25 22:30:41)

Неактивний

#14 2020-02-26 10:40:44

YK
Гість

Re: Глюк связи двух ардуино нано

khalimon пише:

Вообщем сделал в одну строку приём/передачу - получасовой режим отработал впервые до конца. Но всё же успел на табло увидеть разовый глюк, на работу он не отразился,но всё же присутствовал.  Теперь думаю , что контрольную сумму всё же придется использовать.
Ниже мой рабочий текущий вариант

передатчик
if ( millis()-ms8>500) {
if (start==5) {a='5';start=0;}else a = String(start);
StringtoSend=String(timeHour)+";"+String(timeMin)+";"+String(t)+";"+a+":";
Serial.println(StringtoSend);
ms8=millis();        }

приемник

void SerialREAD (){
if (!Serial.available()) return;
String data = Serial.readStringUntil('\n');
str1="";
rr=0;
le=data.length();
for (int qq=0; qq<=le;qq++) {
if (data[qq]==';' || data[qq]==':') {
  switch (rr) {
    case 0:
    timeHour1 = str1.toInt();
     break;
     
    case 1:
    timeMin1 = str1.toInt();
     break;
     
    case 2:
    temperatura1 = str1.toInt();
     break;
     
    case 3:
    start = str1.toInt();
    if (start==5) {flagdisplay=4; zvuk=1;start=0;}
     break;

  }
  rr++;
  str1="";
  }
    else str1=str1+data[qq];

   }

}

Ну вышли полный скетч. а то я не вижу переменных

#15 2020-02-26 17:44:01

khalimon
Учасник
Зареєстрований: 2020-02-24
Повідомлень: 19

Re: Глюк связи двух ардуино нано

khalimon пише:
YK пише:

Будет работать. Дело в том что со строкой можно еще ввести контрольные суммы и т.п. Т.е. если пару пакетов  заглючат, ты их просто проигнорируешь, думаю это не принципиально. зато всегда будешь получать гарантированные данные

..

Несколько раз проверил, вроде нормально работает. В течении недели планирую полностью собрать агрегат. Если хоть раз глюканет - нужно будет контрольную сумму впихнуть. За 200грн поможешь?

Неактивний

#16 2020-02-26 19:55:09

YK
Учасник
Зареєстрований: 2020-02-26
Повідомлень: 27

Re: Глюк связи двух ардуино нано

khalimon пише:
khalimon пише:
YK пише:

Будет работать. Дело в том что со строкой можно еще ввести контрольные суммы и т.п. Т.е. если пару пакетов  заглючат, ты их просто проигнорируешь, думаю это не принципиально. зато всегда будешь получать гарантированные данные

..

Несколько раз проверил, вроде нормально работает. В течении недели планирую полностью собрать агрегат. Если хоть раз глюканет - нужно будет контрольную сумму впихнуть. За 200грн поможешь?

Пришли Sketch весь
Нормально напишу

Неактивний

#17 2020-02-26 20:16:40

г0сть
Гість

Re: Глюк связи двух ардуино нано

khalimon пише:

Расстояние всего 50см.

И зачем две ардуины? Одна не справляется?

#18 2020-02-26 21:16:27

Watchdog
Гість

Re: Глюк связи двух ардуино нано

г0сть пише:

И зачем две ардуины? Одна не справляется?

Одна голова хорошо, а две лучше! smile

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму