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
RS232 ist bidirektional, abfrage vom server sollte gehen. Und auf der Serverseite brauchste halt nen programm, was auf die Daten wartet.
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 =)
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.
Das heißt ich kann mir in Perl oder C ne Endlosschleife baun die mir die daten mit schneidet
>mein Problem ist nur >das ich nur eine Leitung habe Zwei sollten es schon sein, ohne Masse ist das immer arg schwierig. Oliver
> 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':
1 | #!/bin/sh
|
2 | while :; do |
3 | read |
4 | 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)
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
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
> 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.
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"
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:
1 | #!/bin/sh
|
2 | while :; do |
3 | read line |
4 | case "$line" in |
5 | D*E) |
6 | line="${line#D}" # führendes D weg |
7 | line="${line%E}" # E am Ende auch |
8 | echo "$line" |
9 | ;;
|
10 | esac
|
11 | done < /dev/ttyUSB0 > /Pfad/zur/Output-Datei |
Das Wachsen der Output-Datei kannst Du während der Arbeit mit
1 | tail -f /Pfad/... |
in einer Konsole beobachten. Den Pfad natürlich in beiden Schnipseln passend setzen.
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
Tut er doch auch nicht, denn ausgegeben wird nur, was auf's Muster (shell pattern) »D*E« passt. Oder habe ich was übersehen?
Ah coool ich danke erst mal =) werde das ganze jetzt mal testen und dann über erfolg oder misserfolg berichten Schöne Grüße
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
Das wird wahrscheinlich das lokale Echo von deinem Terminalprogramm sein.
Hm was mir gerade noch so einfällt, ich muss doch die ttyS1 noch irgentwie konfiguieren oder?
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
wäre es dann nicht besser den Port direkt mit dem perl-script auszulesen?
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; } }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.