Ви не увійшли.
Сторінки 1
Приветствую!
Есть 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)
Неактивний
Передавай данные одним пакетом например для простоты в одной строке с разделением "," или ";" и терминатор в конце например ":"
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 будет содержать твои данные,
Передавай данные одним пакетом например для простоты в одной строке с разделением "," или ";" и терминатор в конце например ":"
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 ();
Будет ли разница при передачи строки? В любом случае попробую варианты... Спасибо!
Неактивний
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 на передатчике еще кто то пишет, посмотри монитором передатчик.
В любом случае передача все строки надежней ты можешь ее выделить даже как-то. соответственно ты будешь получать только гарантированные валидные пакеты
Ну это не весь код. Возможно в Serial на передатчике еще кто то пишет, посмотри монитором передатчик.
В любом случае передача все строки надежней ты можешь ее выделить даже как-то. соответственно ты будешь получать только гарантированные валидные пакеты
Нашел недоработку в коде передатчика, который мог притормаживать, исправил, проверяю. Если не поможет попробую переделать в строку по вашему способу. По Вашему опыту при моём расстоянии между платами (реально 40-60см) данный способ нормально должен работать?
Неактивний
YK пише:Ну это не весь код. Возможно в Serial на передатчике еще кто то пишет, посмотри монитором передатчик.
В любом случае передача все строки надежней ты можешь ее выделить даже как-то. соответственно ты будешь получать только гарантированные валидные пакетыНашел недоработку в коде передатчика, который мог притормаживать, исправил, проверяю. Если не поможет попробую переделать в строку по вашему способу. По Вашему опыту при моём расстоянии между платами (реально 40-60см) данный способ нормально должен работать?
Будет работать. Дело в том что со строкой можно еще ввести контрольные суммы и т.п. Т.е. если пару пакетов заглючат, ты их просто проигнорируешь, думаю это не принципиально. зато всегда будешь получать гарантированные данные
Передавай данные одним пакетом например для простоты в.....
Не могу помять, где ошибка?
Пишет:
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)
Неактивний
char *str; это char*
Сделай
String myStr=str;
затем используй
myStr.toInt();
моя ошибка в первом примере , я просто наводку давал
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();
}
Неактивний
Будет работать. Дело в том что со строкой можно еще ввести контрольные суммы и т.п. Т.е. если пару пакетов заглючат, ты их просто проигнорируешь, думаю это не принципиально. зато всегда будешь получать гарантированные данные
Если ваш вариант заработает - готов кинуть 200грн(только если вы с Украины), поэтому прошу помочь довести до конца эту часть кода...
Неактивний
Вообщем сделал в одну строку приём/передачу - получасовой режим отработал впервые до конца. Но всё же успел на табло увидеть разовый глюк, на работу он не отразился,но всё же присутствовал. Теперь думаю , что контрольную сумму всё же придется использовать.
Ниже мой рабочий текущий вариант
передатчик
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)
Неактивний
Вообщем сделал в одну строку приём/передачу - получасовой режим отработал впервые до конца. Но всё же успел на табло увидеть разовый глюк, на работу он не отразился,но всё же присутствовал. Теперь думаю , что контрольную сумму всё же придется использовать.
Ниже мой рабочий текущий вариантпередатчик
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];}
}
Ну вышли полный скетч. а то я не вижу переменных
YK пише:Будет работать. Дело в том что со строкой можно еще ввести контрольные суммы и т.п. Т.е. если пару пакетов заглючат, ты их просто проигнорируешь, думаю это не принципиально. зато всегда будешь получать гарантированные данные
..
Несколько раз проверил, вроде нормально работает. В течении недели планирую полностью собрать агрегат. Если хоть раз глюканет - нужно будет контрольную сумму впихнуть. За 200грн поможешь?
Неактивний
khalimon пише:YK пише:Будет работать. Дело в том что со строкой можно еще ввести контрольные суммы и т.п. Т.е. если пару пакетов заглючат, ты их просто проигнорируешь, думаю это не принципиально. зато всегда будешь получать гарантированные данные
..
Несколько раз проверил, вроде нормально работает. В течении недели планирую полностью собрать агрегат. Если хоть раз глюканет - нужно будет контрольную сумму впихнуть. За 200грн поможешь?
Пришли Sketch весь
Нормально напишу
Неактивний
Расстояние всего 50см.
И зачем две ардуины? Одна не справляется?
И зачем две ардуины? Одна не справляется?
Одна голова хорошо, а две лучше!
Сторінки 1