mikrocontroller.net

Forum: Compiler & IDEs RS232 Abfrage ohne Anfrage


Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute, ich habe da mal eine Frage,


Ich will ein AVR  mit einen LINUX Server verbinden, mein Problem ist nur 
das ich nur eine Leitung habe und daher vom SERVER keine Anfragen an den 
AVR schicken kann, ich wollte einfach alle 60s die daten vom AVR 
losschicken.

Nur muss dann der server die gesamte zeit auf Abfrage sein, wie kann ich 
das ambesten lösen?

Der Daten String soll dann zerlegt werden und in einer MySQL datenbank 
untergebracht werden.


Vielleicht habt ihr einen Lösungs ansatz wie ich das gestalten kann, im 
einem AVR würde ich mit INTERRUPS arbeiten aber wie mach ich das unter 
LINUX


Schöne Grüße

Autor: Jens B. (sio2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RS232 ist bidirektional, abfrage vom server sollte gehen.
Und auf der Serverseite brauchste halt nen programm, was auf die Daten 
wartet.

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Jens ja das ist mir an sic klar,
aber ich habe nur leider zwischen dem SERVER und dem AVR nur eine 
leitung zur Verfügung also entweder nur sende oder nur Empfangen =)

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Während der Server - wie Du es ausdrückst - "auf Abfrage" ist, schläft 
er in Wirklichkeit.  Das tut Linux von sich aus, wenn Du z.B. read() 
aufrufst, aber keine Daten verfügbar sind.  Er frisst also kein Heu 
(Rechenzeit).  Bis auf die paar belegten inaktiven kBytes tut das also 
niemandem weh.

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heißt ich kann mir in Perl oder C ne Endlosschleife baun die mir die 
daten mit schneidet

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja.  Ein Shell-Script dürfte es auch tun.

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du vll ne Idee oder n Ansatz wie das aussehen könnte

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>mein Problem ist nur
>das ich nur eine Leitung habe

Zwei sollten es schon sein, ohne Masse ist das immer arg schwierig.

Oliver

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hast du vll ne Idee oder n Ansatz wie das aussehen könnte

Da Du über die Art der Daten keine Angaben machst, kann man nur raten. 
Angenommen, der AVR sendet Textzeilen, abgeschlossen mit '\n':
#!/bin/sh
while :; do
  read
done < /dev/ttyUSB0 > /pfad/zur/Output-Datei

Als Name der Schnittstelle wurde ttyUSB0 angenommen (ein 
USB-Seriell-Adapter).

(Edit: Leseumleitung aus der Schleife raus verlegt)

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich ist da eine Masse :) die hab ich nicht mitgezählt.

Also ein Daten String sieht ca so aus:  D12;34;56;78;90;12;34;56;78;90E

der string soll zerlegt werden und dann in eine Datenbank geschrieben 
werden.

Danke schon mal für eure Hilfe

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei natürlich nicht ausreichtt, nur den read in die Schleife zu 
schreiben.  Ich korrigiere mich also.

#!/bin/sh
while :; do
  read line
  printf '%s\n' "$line"
done < /dev/ttyUSB0 > /pfad/zur/Output-Datei

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Also ein Daten String sieht ca so aus:  D12;34;56;78;90;12;34;56;78;90E
>
> der string soll zerlegt werden und dann in eine Datenbank geschrieben
> werden.

Könntest Du auch noch ausführen, was genau "der String soll zerlegt 
werden" ist?

IFS=\; read elmt1 elmt2 rest_of_line

würde in obigem Shellscript

elmt1=D12, elmt2=34, rest_of_line=56;78;90;12;34;56;78;90E

ergeben.

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo also es wird ein Startzeichen gesendet "D" und zum schluss ein 
Stopzeichen "E"

alles was da zwischen ist ist der eigentliche String

12;34;56;78;90;12;34;56;78;90

bei dem String ist das ";" das Trennzeichen.

es werden sonst auch nur Ziffern (Messwerte) übertragen

Warum ich ein Start und Stopzeichen sende liegt daran, das auf der 
selben Leitung noch ein anderes Gerät liegt was ich mit einem 
Startzeichen "R" ansprechen muss.
Damit der server genau weiß was für Ihn ist sende ich ihm zunächst das 
"D"

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ich das richtig verstanden:  Du möchtest alles ausfiltern, was 
nicht mit "D" beginnt und mit "E" endet und das ist die gesamte 
Verarbeitung?  Dann geht Dein Server so:
#!/bin/sh
while :; do
  read line
  case "$line" in
    D*E) 
      line="${line#D}"  # führendes D weg
      line="${line%E}"  # E am Ende auch
      echo "$line"
    ;;
  esac
done < /dev/ttyUSB0 > /Pfad/zur/Output-Datei
Das Wachsen der Output-Datei kannst Du während der Arbeit mit
tail -f /Pfad/...
in einer Konsole beobachten.  Den Pfad natürlich in beiden Schnipseln 
passend setzen.

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut bin fast am Ziel jetzt ist noch wichtig das der Server nicht auf 
einen String reagiert der zb. so aussieht


A23;132;34343;.....;S


ist das auch möglich?


Danke noch mal für eure große Hilfe

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tut er doch auch nicht, denn ausgegeben wird nur, was auf's Muster 
(shell pattern) »D*E« passt.  Oder habe ich was übersehen?

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah coool ich danke erst mal =)

werde das ganze jetzt mal testen und dann über erfolg oder misserfolg 
berichten


Schöne Grüße

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm so weit klappts noch nicht ich hab jetzt den SERVER mal mit n 
Nullmodemkabel mit einem Rechner verbunden und mit Hterm daten rüber 
geschickt. Leider fiel mir dabei auf das der Server die Daten immer 
gleich wieder zurück spiegelt.  wenn ich ihm "hallo" sende sendet er mit 
"hallo"
zurück


Woran kann das liegen?


Senden vom Server aus geht aber =)


Danke schon mal

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wird wahrscheinlich das lokale Echo von deinem Terminalprogramm 
sein.

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht das aus? "hallohallo" oder "hhaalllloo"?

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
egal was ich sende er schickt mir n Echo =/

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm was mir gerade noch so einfällt, ich muss doch die ttyS1 noch 
irgentwie konfiguieren oder?

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs gelöst =)

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und was wars?

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. der COMport (ttyS1) stand noch im initab als getty daher konnte ich 
ihn nicht öffnen

2. ich muss dem ttyS1 noch ein \r mitsenden damit ich es auspuckt

3. musste ich noch mit stty die bautrate und co einstellen


ich hoffe damit konnte ich wem helfen =)


jetzt ist nur die sache wie bekomm ich den Spaß in einer MySQL-Datenbank

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Perlscript

Gast

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wäre es dann nicht besser den Port direkt mit dem perl-script 
auszulesen?

Autor: Parabol1337 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Lösung:


#!/usr/bin/perl

use strict;
use warnings;
use DBI;

############## MYSQL Verbindung
my $dbHost  = "localhost";
my $dbUser  = "user";
my $dbPass  = "password";
my $dbName  = "messwerte";
my $connect = DBI->connect("DBI:mysql:$dbName:$dbHost", $dbUser, 
$dbPass);
######################################################################## 
####################################
while(1){  ## Endlosschleife
  my $data    = system("cat /dev/ttyS1");
  if($data ne "0"){
    print $data;
    my @splits = split(/:/, $data);
    $sql = "INSERT INTO messwerte (datum, wert1, wert2, wert3, wert4,) 
VALUES ('".time()."', '".$splits[0]."', '".$splits[1]."', 
'".$splits[2]."', '".$splits[3]."')";
    $sth = $connect->prepare($sql);
    $sth->execute;
  }
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.