Відповісти

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

Назад

Огляд теми (нові повідомленні вгорі)

Watchdog
2020-02-26 21:16:27
г0сть пише:

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

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

г0сть
2020-02-26 20:16:40
khalimon пише:

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

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

YK
2020-02-26 19:55:09
khalimon пише:
khalimon пише:
YK пише:

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

..

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

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

khalimon
2020-02-26 17:44:01
khalimon пише:
YK пише:

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

..

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

YK
2020-02-26 10:40:44
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];

   }

}

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

khalimon
2020-02-25 21:26:34

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

передатчик
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 15:49:31
YK пише:

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

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

khalimon
2020-02-25 15:18:14
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();
}

YK
2020-02-25 14:42:40

char *str;  это char*


Сделай
String myStr=str;

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

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

khalimon
2020-02-25 14:08:16
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++;
}

YK
2020-02-25 13:05:34
khalimon пише:
YK пише:

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

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


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

khalimon
2020-02-25 12:16:31
YK пише:

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

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

YK
2020-02-25 11:23:05
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 на передатчике еще кто то пишет, посмотри монитором передатчик.
В любом случае передача все строки надежней ты можешь ее выделить даже как-то. соответственно  ты будешь получать только гарантированные валидные пакеты

khalimon
2020-02-25 09:57:08
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 ();

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

khalimon
2020-02-25 09:46:02
vvr пише:

rs485

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

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