RS232 Abfrage ohne Anfrage

Gast #1495368
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
Gast #1495407
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 =)
#1495409
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
> 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
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
> 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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.