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
am pi mache ich das auslesen so:
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):
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:
edit: sketch im anhang nochmal in code-tags:
danke
frank
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.
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
Post a Comment