Сброс соединения UART на Due

У меня есть система, в которой Arduino Due подключен к Raspi 4 через UART, в которой Due отправляет сигнал сердцебиения через UART, чтобы pi получил и отправил обратно в качестве подтверждения. Одно из событий, которое мне нужно обработать, — это восстановление соединения UART между двумя устройствами, если программа, получающая UART на пи (или сам пи), по какой-либо причине не работает и перезагружается. На данный момент у меня работает начальное сердцебиение (пока программа pi запускается первой), но когда я останавливаю программу pi, чтобы имитировать фатальную ошибку, и перезапускаю ее, кажется, что Due не получает подтверждения сердцебиения, пока он не будет сброшен как хорошо.

Есть ли простой способ сбросить только одно последовательное соединение из скрипта Arduino? Я думал об использовании Serial.end() и Serial.begin(), но это действительно уродливо, и я предпочел бы его избежать. Ни один из других методов библиотеки Serial, по-видимому, не дает возможности сбросить соединение.

Я использую Serial2 на скорости 115 200 бод.

Изменить: включая соответствующий код сердцебиения:

#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 {
    // не возвращается сердцебиение - прекращаем нормальную работу
  }
  Serial.println("heart");
  Serial2.write(255);
}

, 👍2

Обсуждение

Вы хотите сбросить соединение, то есть отключить его и снова включить. Почему вы думаете, что закончить, а затем начать, не является хорошим решением для этого? Что в этом уродливого?, @Delta_G

почему вам нужно использовать 115200 бод для сердцебиения?, @jsotola

@Delta_G Я мог подходить к этому очень неправильно, но то, как я думал об их реализации, означало бы, что и Serial.end(), и Serial.begin() будут выполняться с каждой итерацией цикла. Это только кажется грязным., @Andrew Euredjian

@jsotola определенно не обязательно иметь такую высокую скорость для сердцебиения. Это просто моя скорость по умолчанию, которую я установил для последовательных соединений в целом., @Andrew Euredjian

Зачем делать это в каждом цикле? Необходимо ли сбрасывать связь в каждом цикле? Просто сбросьте его, когда это необходимо, например, когда вы перестанете слышать свое сердцебиение., @Delta_G


1 ответ


Лучший ответ:

1

Глупый я забыл загрузить код, который решил мою проблему. Код, показанный в вопросе, правильный и работает так, как задумано.

,