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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.