期限のUART接続をリセットします

Aug 26 2020

UARTを介してRaspi4に接続されたArduinoDueを含むシステムがあり、DueはUARTを介してハートビート信号を送信し、piが確認として送受信します。私が処理する必要のあるイベントの1つは、pi(またはpi自体)でUARTを受信するプログラムが何らかの理由で失敗して再起動した場合に、2つのデバイス間のUART接続を再確立することです。現時点では、最初のハートビートは機能していますが(piプログラムが最初に起動する限り)、致命的なエラーをシミュレートするためにpiプログラムを停止して再起動すると、Dueはリセットされるまでハートビートの確認を受信しないようです上手。

Arduinoスクリプトから1つのシリアル接続だけをリセットするクリーンな方法はありますか?使うことを考えましたがSerial.end()Serial.begin()それは本当に醜いので避けたいと思います。他のシリアルライブラリメソッドはどれも、接続をリセットする機能を提供していないようです。

私は115200ボーでSerial2を使用しています。

編集:関連するハートビートコードを含める:

#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);
}

回答

1 AndrewEuredjian Aug 26 2020 at 09:45

愚かな私は、私の問題を修正したコードを実際にアップロードするのを忘れていました。質問に示されているコードは正しく、意図したとおりに機能します。