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 am 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 was machen (hier LEDON/LEDOFF)
am Pi mache ich das Auslesen so:
#!/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):
[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 extra 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, was 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 an den Pi zurücksenden
edit: sketch im Anhang nochmal in code-tags:
//disable serial console with raspi-config
//level-shifter between rpi (3.3V) and 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 and off
digitalWrite(13,HIGH);
delay(2000);
digitalWrite(13,LOW);
}
}
void loop() {
keepalive();
char incoming;
//serial data from 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
uarttest.ino (1.31 KB)