Forum: Compiler & IDEs RS232 Abfrage ohne Anfrage


von Parabol1337 (Gast)


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

von Jens B. (sio2)


Lesenswert?

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

von Parabol1337 (Gast)


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 =)

von Hc Z. (mizch)


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.

von Parabol1337 (Gast)


Lesenswert?

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

von Hc Z. (mizch)


Lesenswert?

Ja.  Ein Shell-Script dürfte es auch tun.

von Parabol1337 (Gast)


Lesenswert?

Hast du vll ne Idee oder n Ansatz wie das aussehen könnte

von Oliver (Gast)


Lesenswert?

>mein Problem ist nur
>das ich nur eine Leitung habe

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

Oliver

von Hc Z. (mizch)


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':
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)

von Parabol1337 (Gast)


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

von Hc Z. (mizch)


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

von Hc Z. (mizch)


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.

von Parabol1337 (Gast)


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"

von Hc Z. (mizch)


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:
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.

von Parabol1337 (Gast)


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

von Hc Z. (mizch)


Lesenswert?

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

von Parabol1337 (Gast)


Lesenswert?

Ah coool ich danke erst mal =)

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


Schöne Grüße

von Parabol1337 (Gast)


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

von ozo (Gast)


Lesenswert?

Das wird wahrscheinlich das lokale Echo von deinem Terminalprogramm 
sein.

von MeinerEiner (Gast)


Lesenswert?

Wie sieht das aus? "hallohallo" oder "hhaalllloo"?

von Parabol1337 (Gast)


Lesenswert?

egal was ich sende er schickt mir n Echo =/

von Parabol1337 (Gast)


Lesenswert?

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

von Parabol1337 (Gast)


Lesenswert?

habs gelöst =)

von ozo (Gast)


Lesenswert?

und was wars?

von Parabol1337 (Gast)


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

von Gast (Gast)


Lesenswert?

Perlscript

Gast

von Parabol1337 (Gast)


Lesenswert?

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

von Parabol1337 (Gast)


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;
  }
}

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
Noch kein Account? Hier anmelden.