Skocz do zawartości

Własny protokół dwużyłowy z jedną linią danych - Implementacja programowa.


KatzePL

Pomocna odpowiedź

Połączyłem oba Arduino Mega oraz jedno ESP32 następująco:
polaczenie_uart.thumb.png.d46102e02914d97bd6c20370b1697210.png
Kod Arduino (6):

#define LED 13
#define myID 6

void setup() {
  Serial2.begin(9600);
  pinMode(5,INPUT_PULLUP);
  pinMode(LED,OUTPUT);
  Serial.begin(115200);
}
bool type = false;
const uint8_t number1[4] = {myID,4,4,1};
const uint8_t number2[4] = {myID,7,4,0};
uint8_t bufor[4];
void loop() {
  if (Serial2.available() > 0) {
    while (Serial2.available() < 4);
    while (Serial2.available() >= 4) {
      Serial2.readBytes(bufor, 4);
      char str[40];
      sprintf(str,"Od: %u\nDo:%u\nTyp:%u\nWartość:%u\n\n",bufor[0],bufor[1],bufor[2],bufor[3]);
      Serial.print(str);
      if (bufor[1] == myID) {
        if (bufor[3] == 1) {
          digitalWrite(LED,HIGH);
        }else{
          digitalWrite(LED,LOW);
        }
      }
    }
  }else{
    if (digitalRead(5) == HIGH) {
      pinMode(5,OUTPUT);
      digitalWrite(5,LOW);
      Serial2.write(number1, 4);
      Serial2.write(number2, 4);
      Serial2.flush();
      pinMode(5,INPUT_PULLUP);
      Serial.print("Wysłano\n");
      delay(1000);
    }
  }
}

Kod Arduino (7):

#define LED 13
#define myID 7

void setup() {
  Serial2.begin(9600);
  pinMode(5,INPUT_PULLUP);
  pinMode(LED,OUTPUT);
  Serial.begin(115200);
}
bool type = false;
const uint8_t number1[4] = {myID,4,4,0};
const uint8_t number2[4] = {myID,6,4,1};
uint8_t bufor[4];
void loop() {
  if (Serial2.available() > 0) {
    while (Serial2.available() < 4);
    while (Serial2.available() >= 4) {
      Serial2.readBytes(bufor, 4);
      char str[40];
      sprintf(str,"Od: %u\nDo:%u\nTyp:%u\nWartość:%u\n\n",bufor[0],bufor[1],bufor[2],bufor[3]);
      Serial.print(str);
      if (bufor[1] == myID) {
        if (bufor[3] == 1) {
          digitalWrite(LED,HIGH);
        }else{
          digitalWrite(LED,LOW);
        }
      }
    }
  }else{
    if (digitalRead(5) == HIGH) {
      pinMode(5,OUTPUT);
      digitalWrite(5,LOW);
      Serial2.write(number1, 4);
      Serial2.write(number2, 4);
      Serial2.flush();
      pinMode(5,INPUT_PULLUP);
      Serial.print("Wysłano\n");
      delay(1000);
    }
  }
}

Kod ESP32 (4):

#define LED 2
#define myID 4
void setup() {
  Serial2.begin(9600);
  pinMode(5,INPUT_PULLUP);
  pinMode(LED,OUTPUT);
  Serial.begin(115200);
}
bool type = false;
const uint8_t number1[4] = {myID,7,4,1};
const uint8_t number2[4] = {myID,6,4,0};
uint8_t bufor[4];
void loop() {
  if (Serial2.available() > 0) {
    while (Serial2.available() < 4);
    while (Serial2.available() >= 4) {
      Serial2.readBytes(bufor, 4);
      char str[40];
      sprintf(str,"Od: %u\nDo:%u\nTyp:%u\nWartość:%u\n\n",bufor[0],bufor[1],bufor[2],bufor[3]);
      Serial.print(str);
      if (bufor[1] == myID) {
        if (bufor[3] == 1) {
          digitalWrite(LED,HIGH);
        }else{
          digitalWrite(LED,LOW);
        }
      }
    }
  }else{
    if (digitalRead(5) == HIGH) {
      pinMode(5,OUTPUT);
      digitalWrite(5,LOW);
      Serial2.write(number1, 4);
      Serial2.write(number2, 4);
      Serial2.flush();
      pinMode(5,INPUT_PULLUP);
      Serial.print("Wysłano\n");
      delay(1000);
    }
  }
}

Na wyjściu Serial0 Arduino (6), Arduino (7) oraz ESP32 (4) otrzymuję następujące dane:

Od: 7
Do:4
Typ:4
Wartość:0

Od: 7
Do:6
Typ:4
Wartość:1

Wysłano

Co oznacza że wszystkie urządzenia wchodzą do funkcji wysyłania ale nie odbierają danych innych niż z Arduino z ID=7.

Czy coś powinienem poprawić?

Link do komentarza
Share on other sites

Na pewno bym wrzucił wszędzie między TX a RX rezystor, aby nic przypadkowo nie zjarać. Jak ktoś nie nadaje musi przestawiać TX jako input. 

Kod dam radę analizować jak dzieci zasną... 

Link do komentarza
Share on other sites

Do uart-a można podłączyć więcej urządzeń, zachęcam do poczytania o standardzie RS-485. Ale w takim przypadku konieczne są dodatkowe układy między UART-em, a interfejsem danych.

Edit: dopiero później doczytałem ostatni wpis - faktycznie jeśli TX będzie przestawiany na input, można tak zrobić. Ale jeśli więcej niż jeden UART wysteruje na TX różne wartości to całość może się po prostu popsuć. 

Edytowano przez Elvis
  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.