arduino Serielle Kommunikation über rx/tx


hallo,

ich versuche eine serielle kommunikation mit einem pi herzustellen. dazu habe ich den arduino uno mit den uart-pins (rx/tx) über einen pegelwandler (5v vs. 3,3v) mit dem pi verbunden (jeweils tx->rx).

prinzipiell funktioniert es schon, aber wenn ich pi etwas richtung arduino sende kommt der irgendwie komplett aus dem tritt.

habe mein programm mal rangehängt

  • arduino soll alles,was er bekommt wieder zurück schicken als bestätigung
  • arduino soll bei bestimmten aktionen natürlich machen (hier ledon/ledoff)


am pi mache ich das auslesen so:
code: [select]
#!/bin/bash
while read line; do
    echo "["$(date "+%y-%m-%d %h:%m:%s")"] vom arduino: "$line
done < <(cat /dev/ttyama0)


das senden einfach mit echo "">/dev/ttyama0

in dem moment, wo etwas über die serielle schnittstelle geht (entweder das keepalive vom arduino) oder ich sende etwas vom pi aus, kommt sowas (unendlich lang):

code: [select]

[2017-12-21 11:25:14] vom arduino: �keepalive
[2017-12-21 11:25:14] vom arduino:
[2017-12-21 11:25:14] vom arduino: rx:rx:rx:rx:rx:rx:rx:r:rx:rx:rx:r
[2017-12-21 11:25:14] vom arduino:
[2017-12-21 11:25:14] vom arduino: rx:rx:rx:rx:rx:rx:rx:rx:r^@:rx:rx:rx:r
[2017-12-21 11:25:14] vom arduino:
[2017-12-21 11:25:14] vom arduino: rx:rx:rx:rx:rx:rx:rx:rx:rx:r^@:rx:rx:rx:r
[2017-12-21 11:25:14] vom arduino:
[2017-12-21 11:25:14] vom arduino: rx:rx:rx:rx:rx:rx:rx:rx:rx:rx:r^@:rx:rx:rx:r
[2017-12-21 11:25:14] vom arduino:
.....


habe schon ein flush und die string-längen-prüfung rein, aber trotzdem kommt dieses gefloode

evtl. sieht jemand, wo der fehler in meinem code ist...

kurze erklärung, der arduino-code machen soll:
  • er soll in bestimmten zeitabständen ein "keepalive" zum pi schicken (sich halt melden, dass er noch da ist)
  • und wenn etwas rein-kommt soll er bis zum zeilenumbruchzeichen (\r bzw. \n) den "befehl" zusammenbauen und dann in handle_command verarbeiten (in dem beispiel bei ledon/ledoff die led ein/ausschalten), diese befehle soll er als quittierung den pi zurücksenden


edit: sketch im anhang nochmal in code-tags:

code: [select]
//disable serial console raspi-config
//level-shifter between rpi (3.3v) , arduino (5v)!

#include <softwareserial.h>

#define alive_interval 60000 //timer-interval (milliseconds)

string s="";
unsigned long alivetimer=0;

void setup() {
   serial.begin(9600);
   while(!serial);
   serial.println("setup complete");
}

void keepalive()
{
  //sending keepalive
  if (alivetimer==0) alivetimer=millis();
  if (millis()-alivetimer >= alive_interval)
  {//so check every minute
    serial.println("keepalive");
    alivetimer=millis();
  }
}

void handle_command(string cmd)
{
  serial.print("rx:");
  serial.println(cmd);
  serial.flush();
  if (cmd == "ledon"){      // turn led on
    digitalwrite(13,high);
  }else
  if (cmd == "ledoff"){      // turn led on
    digitalwrite(13,low);
  }else
  if (cmd == "keepalive"){      // turn led on , off
    digitalwrite(13,high);
    delay(2000);
    digitalwrite(13,low);
  }
}

void loop() {
  keepalive();
  char incoming;
  //serial data pi
  if (serial.available() > 0) {
    while(serial.available() > 0)
    {
      incoming = serial.read();
      if ((incoming != '\n') && (incoming != '\r'))
        s+=incoming;
      else //command complete on linebreak
      {
        if (s.length())
        {
          handle_command(s);
          s="";
        }
      }
    }
  }
}


danke

frank

um auch den mobilen usern die die möglichkeit zu geben, den sketch richtig zu lesen, solltest du den wie deine anderen codes hier im forum posten.

setze den bitte in code-tags.

verwende dazu die schaltfläche </> oben links im editorfenster.
das kannst du auch nachträglich machen.
dazu den sketch markieren und die schaltfläche klicken.


damit wird dieser für alle besser lesbar.


Arduino Forum > International > Deutsch (Moderator: uwefed) > arduino Serielle Kommunikation über rx/tx


arduino

Comments

Popular posts from this blog

Error compiling for board Arduino/Genuino Uno.

Installation database is corrupt

esp8266 (nodemcu 0.9) client.write très lent ???