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