Skocz do zawartości

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


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ć?

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ą... 

(edytowany)

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
  • 1 rok później...

Jako że całkowicie przechodzę z projektami na rodzinę STM32, postanowiłem użyć natywnego trybu Half-Duplex.

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