криво работает передача информации между ардуинами

Timur&&&

✩✩✩✩✩✩✩
11 Мар 2021
1
0
Код надо размещать используя соответствующий тэг
Здравствуйте, пытаюсь реализовать двухстороннее общение между двумя ардуино нано по ком портам, на основе этого примера https://alexgyver.ru/gyverbus/.
Если реализовывать отправку данных только в одну сторону, то все работает нормально. А если добавлять второй последовательный порт, и как бы "дозеркалить" части программ, то мигает один светодиод на одной из плат, либо вообще ни один не мигает. Укажите на ошибку. Если прошивки перекидывать местами, то мигающий светодиод меняется, получается дело в самом коде. Код на обоих ардуинках :
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 9); // RX, TX
SoftwareSerial ySerial(8, 7);

struct BACK {
int stoP;
int Run;
};
struct go {
int stoP2;
\
};
go ignal;
unsigned long time = 0;
BACK Signal;
void setup() {

mySerial.begin(19200);
pinMode(5,OUTPUT);
pinMode(4,INPUT);
ySerial.begin(9600);

}
void loop() {

if (mySerial.readBytes((byte*)&Signal, sizeof(Signal))) {
Serial.println(Signal.stoP);
if ( Signal.stoP ==1 )
{digitalWrite(5,1);}
else
{digitalWrite(5,0);
}
}
ignal.stoP2= digitalRead(4);
if(millis() - time > 4000) {
ySerial.write((byte*)&ignal, sizeof(ignal));
time=millis();
}
}

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 9);
SoftwareSerial ySerial(8, 7);
struct BACK {
int stoP;
int Run;
};
BACK Signal;
struct go {
int stoP2;

};
go ignal;
unsigned long time=0;
void setup() {
// put your setup code here, to run once:

mySerial.begin(19200);
pinMode(4,INPUT);
ySerial.begin(9600);
pinMode(5,OUTPUT);
}

void loop() {
Signal.stoP= digitalRead(4);
if(millis() - time > 4000) {
mySerial.write((byte*)&Signal, sizeof(Signal));
time=millis();
Serial.println(Signal.stoP);}
if (ySerial.readBytes((byte*)&ignal, sizeof(ignal))) {
;
if ( ignal.stoP2 ==1 )
{digitalWrite(5,1);}
else
{digitalWrite(5,0);
}
}}
 

OKF

✩✩✩✩✩✩✩
29 Фев 2020
33
7
Тимур, код не хочешь правильно вставить?
 

bort707

★★★★★★✩
21 Сен 2020
3,069
916
Если реализовывать отправку данных только в одну сторону, то все работает нормально. А если добавлять второй последовательный порт, и как бы "дозеркалить" части программ, то мигает один светодиод на одной из плат, либо вообще ни один не мигает. Укажите на ошибку.
ошибка очень простая - не читаете документацию
Одновременно на ардуино может работать только один СофтСериал (точнее, чтобы работало больше - надо работать определенным образом и очень хорошо понимать, что делаешь - это явно не для вас вариант)

А главное мне совершенно не понятно, нафига для связи между двумя платами открывать два СофтСериала? Для этого вполне достаточно одного, ведь Сериал - двухсторонний интерфейс
 
  • Лойс +1
Реакции: Nikanor

fetus

✩✩✩✩✩✩✩
12 Дек 2020
17
0
Тоже интересна тема. Все примеры на библиотеку gyverbus либо прием либо отправка. Как правильно организовать и прием и отправку с ардуины на ардуину?
C++:
#include "GBUS.h"
GBUS bus(&Serial, 5, 20);
#include "GyverTimer.h"
GTimer myTimer(MS, 100);
void setup() {
 
  Serial.begin(9600);
}

void loop() {
   bus.tick();
 if (myTimer.isReady()) {
  byte dataT[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
  bus.sendData(3, dataT);
 }

if (bus.gotData()) {
    byte dataR[11];
 
    bus.readData(dataR);
    
    for (byte i = 0; i < sizeof(dataR); i++) {
      Serial.print(dataR[i]);
      Serial.print(',');
    }
    Serial.println();
  }

C++:
#include "GBUS.h"
GBUS bus(&Serial, 3, 20); 
#include "GyverTimer.h"
GTimer myTimer(MS, 100);
void setup() {
  Serial.begin(9600);
}

void loop() {
 
  bus.tick();
 if (myTimer.isReady()) {
  byte dataT[] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
  bus.sendData(5, dataT);
 }
 
  if (bus.gotData()) {
    byte dataR[11];
 
    bus.readData(dataR);
    
    for (byte i = 0; i < sizeof(dataR); i++) {
      Serial.print(dataR[i]);
      Serial.print(',');
    }
    Serial.println();
  }
}
Пробовал так , работает ,но коряво.