INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Serielle Kommunikation Arduino <-- Raspberry
25.01.2020, 13:16 (Dieser Beitrag wurde zuletzt bearbeitet: 25.01.2020 17:57 von wolf.)
Beitrag #1
Question Serielle Kommunikation Arduino <-- Raspberry
Guten Tag liebe Foren-Mitglieder.

Ich möchte mit einem Arduino Nano die von einem Raspberry Pi auf dem seriellen Weg gesendete Daten wie CPU-Temperatur, Datum u. Zeit weiter verarbeiten.
Bei dem Zuordnen der Empfangsdaten, Auffüllen des Daten-Array mit Indexierung und dem späteren Zuordnen globaler Variablen bin ich mir unsicher.
Die genauere Programm/Fehler-Beschreibung erfolgt im Sketch.
Vorab danke für jede Hilfe, ich bin kein C++ Kenner... Blush

Liebe Grüße Wolf

Code:
/*
Als Grundlage für das Programm benutzte ich  https://forum.arduino.cc/index.php?topic=133165.0

Auf dem Pi wird alle zwei Sekunden nachstehendes Bash-Command ausgeführt :
echo `vcgencmd measure_temp | cut -c 6-9 | tr -d '.'; date +%d.%m.%y.%H.%M` | sed 's/ /,/g' | sed 's/[.]/,/g' | sed -e 's/$/,/' >> /dev/ttyS0

Obige echo Ausgabe auf den Pi zeigt testweise ohne Umlenkung auf /dev/ttyS0 z.B.:   494,24,01,20,16,57,   an und besagt das eine Temperatur in Höhe 492 am 24.Jan. 20 um 16 Uhr und 57 Minuten vorliegt.
Es wird praktisch im Daten-Format   Temp,DD,MM,YY,hh,mm,  gesendet, wobei das Komma als Trennzeichen hinter jeder Variablen steht.
Am Ende des immer 19 Zeichen langen Datenblocks folgt ein CR Zeichen des Pi und der Block wird an die serielle Schnittstelle weitergeleitet.
Der Datenblock beansprucht laut Scope eine Gesamtlänge von ~1.81 mS incl. 2 Stopbit und CR

------------ Anfang Fehlerbeschreibung -----------------
Wenn  char buffer[4]  und  dindex = ++dindex % 8   gesetzt läuft Sketch entweder sofort oder nach mehrmaligen Reset syncron mit der Datenanzeige auf dem Monitor oder auch wenn die Monitor-Ausgabe mehrfach geschlossen und wieder geöffnet wird.
Wie ist das via Software korrigierbar ?
------------  Ende Fehlerbeschreibung ------------------

Die  Monitor-Ausgabe ist auf (CR) eingestellt

Der Nano liest  Daten an dem RX-Pin 'D1' ein
Die Verbindung Nano zu Raspberry Pi erfolgt über ein 1m langes abgeschirmtes Kabel mit einem 3.3V zu 5V Schnittstellen Pegelwandler dazwischen.
Rx <-> Tx über Kreuz wie im Attachment ersichtlich.

Das Hochladen des Sketches muss kurzzeitig die serielle Verbindung um Pi getrennt werden.

Mein Gedanke :
Aus meiner Sicht kommt das XON/XOFF Protokoll wegen kleinen Daten-Blockgröße nicht wirklich zum Tragen.
Daher habe ich die Empfang-Leitung des Pi (RX) ist offen gelassen der Nano kann also bei Überlauf seines Empfangspuffers dem Pi über die TX-Leitung nichts zurückschicken. Auch nicht die Daten die über die USB-Schnittstelle zur Arduino-IDE zurückgesendet werden und der Nano sonst nach wenigen Sekunden stehen bleibt.
*/


char   buffer[4];  
int      data[6], // Data-Array
            Temp, // Temperatur 3 stellig
        DD,MM,YY, // Datum je   2   "
           hh,mm, // Zeit  je   2   "
          bindex, // Buffer-Index    
        dindex=0; // Daten-Index
float      TempF;
          
void setup() {Serial.begin(115200);}


void Assign_Var (int w0, int w1, int w2, int w3, int w4, int w5) {
Temp=w0; DD=w1; MM=w2; YY=w3; hh=w4; mm=w5;    
}

void Read_RX() {
  while(Serial.available()>0) {
    buffer[bindex] = Serial.read();                       // aktuelles Zeichen einlesen  
    if(buffer[bindex] == ',' || buffer[bindex] == '\n' || buffer[bindex] == '\r') { // Variablen-Tenner oder new Line oder  CR '\r' ??
      buffer[bindex] = 0;                                 // Null-Terminierung
      data[dindex] = atoi(buffer);                        // String in
      dindex = ++dindex % 8;                              // Datenindex rotieren
                                                          // Nun die Variablem aus dem Array befüllen
      if (dindex==0) Assign_Var (data[0],data[1],data[2],data[3],data[4],data[5]);
      bindex = 0;                                         // Buffer Index zurücksetzen
    } else {bindex++;}
  }  
}

void Display_Monitor() {
  TempF=Temp; Serial.print("Temp : "); Serial.println(TempF/10, 1);
  Serial.print("DD   : "); Serial.println(DD);
  Serial.print("MM   : "); Serial.println(MM);
  Serial.print("YY   : "); Serial.println(YY);
  Serial.print("hh   : "); Serial.println(hh);
  Serial.print("mm   : "); Serial.println(mm);
  Serial.println();
// delay(1000);  
}


void loop() {
   Read_RX();
   Display_Monitor();

}


Angehängte Datei(en) Thumbnail(s)
       
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2020, 14:15
Beitrag #2
RE: Serielle Kommunikation Arduino <-- Raspberry
Im Normalfall liest man erst die ganze Nachricht ein und zerlegt sie dann mit strtok.

Der Buffer muss dabei immer Länge der Nutzzeichen + 1 (für '\0') sein. Ein Beispiel dafür findest Du hier.

Sorry, Deine Fehlerbeschreibung ist mir unklar. In 2 Sekunden ist die serielle Nachricht garantiert verarbeitet.
Du wirst aber mit Sicherheit nichts von D2 einlesen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2020, 16:48
Beitrag #3
RE: Serielle Kommunikation Arduino <-- Raspberry
Danke für die schnelle Antwort.
Ich werde deinem Beispiel-Link folgen
D2 ist Schreibfehler von mir,
es ist tatsächlich D1.

Gruß Wolf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2020, 16:53 (Dieser Beitrag wurde zuletzt bearbeitet: 25.01.2020 16:53 von Tommy56.)
Beitrag #4
RE: Serielle Kommunikation Arduino <-- Raspberry
Du könntest es auch mal mit SoftwareSeriell auf anderen Pins probieren (9600 Baud), da hättest Du die Verbindung zum Seriellen Monitor zum Debuggen frei und brauchst nicht immer umstecken beim Programmieren.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2020, 16:58
Beitrag #5
RE: Serielle Kommunikation Arduino <-- Raspberry
(25.01.2020 16:48)wolf schrieb:  Danke für die schnelle Antwort.
Ich werde deinem Beispiel-Link folgen
D2 ist Schreibfehler von mir,
es ist tatsächlich D1.

Gruß Wolf

Dann ändere es bitte in deiner Beschreibung, bevor das jemand nachbaut und sich ärgert.
Und dann folge dem Tipp von Tommy und verwende SoftwareSerial. Das funktioniert auch noch mit 19200 Bd.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2020, 18:01
Beitrag #6
RE: Serielle Kommunikation Arduino <-- Raspberry
Hallo Dieter,
habe eben erst gesehen das bereits abgeschickter Sketch korrigiert werden kann.
Sehr nützlicher Hinweis.
Danke.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2020, 18:05
Beitrag #7
RE: Serielle Kommunikation Arduino <-- Raspberry
(25.01.2020 18:01)wolf schrieb:  Hallo Dieter,
habe eben erst gesehen das bereits abgeschickter Sketch korrigiert werden kann.
Sehr nützlicher Hinweis.
Danke.

Alles klar, geht ja auch nur eine begrenzte Zeit.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Flag Übergabe Fehlerhaft bei Serial Kommunikation Tobias1886 5 355 26.08.2020 17:04
Letzter Beitrag: Tobias1886
  Serielle Werte in String einlesen um damit zu rechnen 425t 2 251 26.08.2020 13:19
Letzter Beitrag: 425t
  Verzögerung bei Serieller Kommunikation dl3ad 15 2.326 27.05.2020 21:57
Letzter Beitrag: GuaAck
Question Arduino <-- Processing - Serielle Kommunikation Graf 9 970 05.04.2020 18:05
Letzter Beitrag: Graf
  Serielle Schnittstelle 50 baud Rainer2 14 1.250 26.03.2020 21:29
Letzter Beitrag: MicroBahner
  Vorlage für Char Array über Serielle Schnittstelle Luis90 2 645 08.03.2020 18:05
Letzter Beitrag: hotsystems
  IR Kommunikation Blende8 0 416 04.02.2020 09:47
Letzter Beitrag: Blende8
  Wert von einem Arduino zu einem zweiten Arduino senden Thorsten_S 9 2.343 14.10.2019 14:48
Letzter Beitrag: Thorsten_S
  Serielle Ausgabe in Setup streikt Mustermann 2 881 10.10.2019 18:26
Letzter Beitrag: Mustermann
  Serielle Ansteuerung einer I2C LCD, Darstellung von Zahlen Peter05 7 1.678 21.05.2019 21:06
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste