RS232 Abfrage ohne Anfrage

Gast #1495368
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
#1495409
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.
#1495439
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)
Gast #1495451
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
#1495470
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.
Gast #1495484
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"
#1495492
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.
Gast #1495647
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
Gast #1496795
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
Gast #1497208
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
Gast #1497427
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren