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

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.