Zresetuj połączenie UART w terminie

Aug 26 2020

Mam system, który obejmuje Arduino Due podłączony do Raspi 4 przez UART, w którym Due wysyła sygnał bicia serca przez UART, aby pi odebrał i odesłał jako potwierdzenie. Jednym ze zdarzeń, które muszę obsłużyć, jest ponowne ustanowienie połączenia UART między dwoma urządzeniami, jeśli program odbierający UART na pi (lub sama pi) nie powiedzie się z jakiegokolwiek powodu i ponownie się uruchomi. W tej chwili początkowe bicie serca działa (o ile program pi uruchamia się jako pierwszy), ale kiedy zatrzymuję program pi, aby zasymulować błąd krytyczny i ponownie go uruchamiam, Due nie wydaje się otrzymywać potwierdzenia bicia serca, dopóki nie zostanie zresetowany jako dobrze.

Czy istnieje czysty sposób zresetowania tylko jednego połączenia szeregowego ze skryptu Arduino? Myślałem o użyciu Serial.end()i Serial.begin(), ale to naprawdę brzydki i wolałbym tego uniknąć. Żadna z innych metod biblioteki szeregowej nie wydaje się zapewniać możliwości resetowania połączenia.

Używam Serial2 z prędkością 115200 bodów.

Edycja: w tym odpowiedni kod pulsu:

#include <DueTimer.h>

bool heartbeat = true;

void rx_heartbeat() {
  int received_data;

  if (Serial2.available() > 0) {
    received_data = Serial2.read();
    heartbeat = true;
    Serial.println("beat");
  }
}

void setup() {
  Serial2.begin(115200);
  Timer1.attachInterrupt(heartbeat_ISR).setFrequency(1).start();
}

void loop() {
  rx_heartbeat();
}

void heartbeat_ISR() {
  if (heartbeat) {
    heartbeat = false;
  } else {
    // no heartbeat returned - stop normal operation
  }
  Serial.println("heart");
  Serial2.write(255);
}

Odpowiedzi

1 AndrewEuredjian Aug 26 2020 at 09:45

Głupi, że zapomniałem załadować kod, który naprawił mój problem. Kod pokazany w pytaniu jest poprawny i działa zgodnie z przeznaczeniem.