Forum: PC-Programmierung RS232 Werte in MySQL Datenbank


von M.of.D (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

nach einiger Suche und keinen brauchbaren Ergebnissen, trage ich mein 
Anliegen in einem neuen Thema vor.

Es geht darum, Werte von der RS232-Schnittstelle in eine MySQL Datenbank 
zu schreiben. Bis jetzt habe ich nur ein Skript zum Laufen gebracht, 
dass
immer wieder Datenwerte von einer .html-Seite abholt und in der 
Datenbank
speichert.

Nun möchte ich einen String von einem µC auslesen und in eine MySQL 
Datenbank speichern. Da ich keine Ahnung von der Programmierung in PHP, 
Perl usw. habe, schlugen meine Versuche fehl.

der String sieht folgendermaßen aus:
1
523;653;1\r

Versucht habe ich schon folgendes:
Text aufzeichnen -> als Seite im Browser aufrufen -> PHP-Skript abfrage
Mit LabView das ganze zu lösen.


Hat einer von Euch sowas schon einmal gemacht?
Oder kann man das vorhandene Skript so abändern, das es auf die RS232 
zugreift?

Im Anhang noch das PHP-Skrip

Gruß
Stefan

von Olaf D. (Firma: O.D.I.S.) (dreyero)


Lesenswert?

Hallo,

das ist nicht sonderlich schwer.
Ich würde ein C(++) programm schreiben, welches die Daten von der RS232
einliest und welches mittels der MySQL-Client-Library in dieselbe 
schreibt.
Stichwort: embedded SQL.

Wenn es ein bisschen einfacher sein soll, nimm Qt. Das hat eine schöne 
SQL-API.


Gruß


Olaf

von M.of.D (Gast)


Lesenswert?

Wäre es nicht möglich das vorhandene Skript so abzuändern, das es die 
Werte von der RS232 nimmt und in die MySQL-Datenbank speichert?

von Olli (Gast)


Lesenswert?

Hallo,
ich habe da auch mal eine Frage. Ich benutze noch den etwas älteren 
Webserver von Ulrich Radig mit einem  Atmega32. Da stehen die Werte 
hinter eine Textzeile. Etwa so: Wonzimmer Temperatur: 22 Grad. Nun würde 
ich gern mit diesem Script die 22 Grad auslesen und in meine SQL 
Datenbank speichern.
Ich kenn mich mit php auch nicht so gut aus. Was müßte ich ändern, damit 
das geht?
Danke im voraus!
Gruss

von Εrnst B. (ernst)


Lesenswert?

Olli schrieb:
> Ich kenn mich mit php auch nicht so gut aus. Was müßte ich ändern, damit
> das geht?

Dann würde ich zuerst das "PHP" ändern. Nimm stattdessen eine 
Programmiersprache mit der du dich auskennst. MySQL lässt sich von fast 
allen aus ansprechen.

von M.of.D (Gast)


Lesenswert?

Hallo,


@Olli
schau mal hier rein: http://web.bs-cham.de/wiki/index.php/MCU-Webserver
im Anhang habe ich die PHP-Datei mal abgeändert. Ich weiß nicht ob es 
mit zwei getrennten Wörtern funktioniert. Bis jetzt habe immer nur 1 
Wort als Variable gehabt.

Natürlich musst du noch die IP des Boards und die Daten für die MySQL 
Datenbank eintragen.

Gruß

Stefan

von M.of.D (Gast)


Angehängte Dateien:

Lesenswert?

Anhang vergessen

von Olli (Gast)


Lesenswert?

Hallo M.of. D,
danke für deine Hilfe!!! Sehe ich das Richtig? Bei mir in der Webpage.c 
steht folgendes:
"    <td><p align=\"center\">Wohnzimmer</p>    </td>"

"    <td><p align=\"center\">%stT_wo</p>    </td>"
"    <td><p align=\"center\">%st+_wo</p>    </td>"
"    <td><p align=\"center\">%st-_wo</p>    </td>"
//"    <td><p align=\"center\">%stH_wo</p>    </td>"
ich muss also diese Zeile "Temperatur=%VA@05\r\n"
aus deinem Script ind folgende umändern "Temperatur=%stT_wo\r\n"
???
Ich habe meine SQL mit Xampp unter WinXP.
Was muss ich hier noch alles anpassen?
`/* Erstellen der SQL Anfrage */
$query = "INSERT INTO avrdat (dattim, Temperatur Wohnzimmer) values ";
$query = $query . "(now(),'$Temperatur Wohnzimmer')";
Meine Sql Datenbank heisst home und die Felder heissen Wohnzimmer, 
Keller u.s.w.?

Olli

von M.of.D (Gast)


Lesenswert?

in dem PHP-Skript musst du beachten das alles mit
1
//text
1
/*text*/
Kommentare sind.

So sieht meine Ausgabe zur Zeit aus:

Server=grn
Aussen=15,3
WW Speicher=57,2
Sensor2=0,0
Sensor3=0,0
kWh=1
Leistung=167
Offset=0


Hier musst du deine Variablennamen ändern im Skript:
1
// Analoge Werte                                                    
2
$Temperatur = getAVRNetIOValue("Temperatur"); //Variable definieren
3
$emperatur = $Temperatur / 10;
4
/*$Luftfeuchte = getAVRNetIOValue("Luftfeuchte");
5
$Luftfeuchte = $Luftfeuchte /10;
6
$AD3 = getAVRNetIOValue("AD3");*/

in der SQL-Anfrage musst
1
$query = "INSERT INTO home (dattim, Wohnzimmer, Keller, usw.) values ";
2
$query = $query . "(now(),'$Wohnzimmer', '$Keller', '$usw.')";

ich hoffe das es dir so klarer erscheint, weil ich habe auch erst mit 
der ganzen Datenerfassung angefangen und kann gerade meine 5 Werte in 
die MySQL DB schreiben.

von olli (Gast)


Lesenswert?

Hallo M.of.D

danke dass Du mir hilfst!!!
Mit denem Script habe ich jetzt soweit hinbekommen.
Ich bekomme aber noch eine Fehlermeldung von der SQL.
Auslesen der AVR Werte erfolgreich!

Verbindung zum Datenbankserver erfolgreich.
Anfrage: INSERT INTO home (keller) values (now(),' Keller') 
fehlgeschlagen: Column count doesn't match value count at row 1
Was kann das sein?
Olli

von Karl H. (kbuchegg)


Lesenswert?

olli schrieb:
> Hallo M.of.D
>
> danke dass Du mir hilfst!!!
> Mit denem Script habe ich jetzt soweit hinbekommen.
> Ich bekomme aber noch eine Fehlermeldung von der SQL.
> Auslesen der AVR Werte erfolgreich!
>
> Verbindung zum Datenbankserver erfolgreich.
> Anfrage: INSERT INTO home (keller) values (now(),' Keller')
> fehlgeschlagen: Column count doesn't match value count at row 1
> Was kann das sein?

Du sagst deinem SQL, es möge doch bitte in der einen Spalte
      INTO  home (keller)
(die Spalte namens 'keller' in der Tabelle 'home') die beiden Werte
      values( now(), ' Keller' )
ablegen

'column count'      Anzahl der Spalten
'value count'       Anzahl der Werte
'does not match'    stimmt nicht überein

von olli (Gast)


Lesenswert?

Hallo  M.of.D,

danke an alle! Es klappt jetzt.
Wie könnte man es hinbekommen, dass dieses Update.php alle 10min. 
aufgerufen wird? Cronjobs gehen ja anscheinend nicht unter Xampp.
Kann man in Xampp Sql es so einstellen, das er mir zu jedem Neuen 
Eintrag einen Timestamp dazu schreibt?
Olli

von M.of.D (Gast)


Lesenswert?

Hallo,

gut das ich dir helfen konnte

schau nochmal auf diese Seite
http://web.bs-cham.de/wiki/index.php/MCU-Webserver

Hier:
  Script-Ausführung automatisieren

    * Wget installieren
    * EZScheduler installieren
          o Mit EZScheduler folgende (angepasste!) Batch-Datei 
zeitgesteuert (z.B. alle 5 Minuten) ausführen lassen

C:
CD\
CD wget
c:\wget\wget -r http://192.168.178.32/avrweb/update.php

die IP in deine Server IP umschreiben und das verzeichnis wo du die 
update.php abgelegt hast.
Am besten unter C:\XAMPP\htdocs\avrweb
oder ähnlichem.

von M.of.D (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe jetzt mal von diesem Thread
Beitrag "RS232 mit PHP"
versucht die RS232-Schnittstelle auszulesen, aber leider ohne Erfolg.

Er bringt mir immer wieder diese Fehlermeldung:

Warning: fopen(com2) [function.fopen]: failed to open stream: Permission 
denied in C:\xampp\htdocs\avrweb\rs232.php  on line 33
Port zum lesen nicht geöffnet

Was passt ihm hier nicht?

von FJS (Gast)


Lesenswert?

Hey
bist du dir sicher, dass die RS232 die com2 ist? Es gibt hunderte dieser 
comX sachen.
Hatte nämlich erst vor Kurzem damit zu tun - zwar in Linux
aber da mussten wir auch einige "Com"bzw TTY durchprobieren, bis wir die 
Richtige hatten.
Und wenn du so einen USB to RS232 Adapter verwendest
bist du sicher , dass er (richtig) installiert ist?
LG

von M.of.D (Gast)


Lesenswert?

Com2 müsste stimmen, weil beim HyperTerminal funktioniert auch com2.

Der USB-Seriell Adapter läuft normalerweise problemlos, weil ich mit dem 
immer Programmiere und so.

von M.of.D (Gast)


Lesenswert?

Guten Abend,

mein Problem, dass ich die zwei oder drei Werte, die der µC über RS232 
schickt, ist immer noch nicht gelöst.

Hat nicht zufällig jemand so etwas schon gemacht? Egal in was für einer 
Sprache.
Die Daten von der RS232 auswerten und dann in eine MySQL-DB schreiben.

von Olli (Gast)


Lesenswert?

@ M. of.D,
hast Du schon mal die Werte aus der SQL mittels JPGraph dargestellt?
Ich habe es mit dem Script von der Seite 
http://www.haeussler.name/blogs/hobby/category/php/ probiert. Aber ich 
bekomme nur Fehlermeldungen. JPGraph funzt sonst. Ein Beispiel aus der 
Example Datei, zeigt er an. Ich habe das Scribt von der Seite angepasst. 
Aber es kommt noch die Fehlermeldung:
Parse error: parse error in C:\xampp\htdocs\temp.php on line 27
Hier das Script:
    <?php
    # ————————————————-
    # Datei: graph_48h.php
    # benötigt: jpgraph Libs
    # ————————————————-
    # Beschreibung:
    # Holt Werte aus einer Datenbank und generiert draus ein Diagramm 
mit jpgraph
    # ————————————————-
    # Autor: Christian Haeussler
    # geändert am: 04.07.2008
    # ————————————————-

    // jpgraph Libs einbinden
    require_once('C:\xampp\htdocs\src\jpgraph.php');
    require_once('C:\xampp\htdocs\src\jpgraph_line.php');
    require_once('C:\xampp\htdocs\src\jpgraph_date.php');

    // Grafik definieren
    $graph = new Graph(800,600,”auto”,60);
    $graph->SetScale(“datlin”);
    $graph->SetY2Scale(“lin”);

    // Raender definieren
    $graph->img->SetMargin(60,60,40,80);

    // Datumsformat der Zeitachse einstellen
    $graph->xaxis->scale->SetDateFormat(‘H:i’);

    // Maximal und Minimalwert der Skala einstellen
    $graph->xaxis->scale->SetTimeAlign(MINADJ_10);

    // Label-Text Winkel um 90° drehen
    $graph->xaxis->SetLabelAngle(90);

    $sline = new PlotLine(HORIZONTAL,0,”black”,1);
    $graph->Add($sline);

    // Verbindung zu mySQL aufbauen, auswählen einer Datenbank
    $link = mysql_connect(“localhost”, “xxxx”, “xxxx”);
    mysql_select_db(“home”);

    // ausführen der SQL Anfrage (288 Werte = 2 Tage  24 h  60 min / 
10 min)
    //$query = “SELECT * FROM DB ORDER BY id DESC LIMIT 288"?;
    $result = mysql_query($query);

    // Ausgabe der Ergebnisse in Array
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $times[] = $row["aussen"];
    $ydata1[] = $row["keller"];
    $ydata2[] = $row["Opel_Temp"];
    }

    // Freigeben des Resultsets
    mysql_free_result($result);

    // schliessen der mySQL Verbinung
    mysql_close($link);

    // Arrays umsortieren
    $times = array_reverse($times);
    $ydata1 = array_reverse($ydata1);
    $ydata2 = array_reverse($ydata2);

    // Die Zwei Linien generieren
    $lineplot1 = new LinePlot($ydata1,$times);
    $lineplot2 = new LinePlot($ydata2,$times);

    // Legende definieren
    $graph->legend->Pos(0.50,0.95,”center”,”top”);
    $graph->legend->SetLayout(LEGEND_HOR);
    $graph->legend->SetShadow(false);

    // Titel für Legende
    $lineplot1->SetLegend('aussen ');
    $lineplot2->SetLegend('keller ');

    $graph->xaxis->SetPos(“min”);
    $graph->xgrid->Show(true,false);

    // Titel und Beschriftung der Skalen
    $graph->title->Set('Verlauf der Daten');
    $graph->subtitle->Set('über 48 Stunden');
    $graph->subtitle->SetColor(“darkred”);
    $graph->xaxis->title->Set(“t”);
    $graph->xaxis->SetTitleSide(SIDE_RIGHT);
    $graph->yaxis->title->Set(“°C”);
    $graph->yaxis->SetColor(“red”);
    $graph->y2axis->title->Set(“%rH”);
    $graph->y2axis->SetColor(“blue”);

    // Schriftarten und Groesse festlegen
    $graph->title->SetFont(FF_FONT2,FS_BOLD);
    $graph->subtitle->SetFont(FF_FONT1,FS_BOLD);
    $graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
    $graph->y2axis->title->SetFont(FF_FONT1,FS_BOLD);
    $graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);

    // Lienfarben und staerke definieren
    $lineplot1->SetColor(“blue”);
    $lineplot1->SetWeight(2);
    $lineplot2->SetColor(“red”);
    $lineplot2->SetWeight(2);

    // Die Linien zu der Grafik hinzufügen
    $graph->AddY2($lineplot1);
    $graph->Add($lineplot2);

    // Grafik anzeigen
    $graph->Stroke();
    ?>

Passwort und Benutzer sind natürlich eingetragen.
Gruss
Olli

von didadu (Gast)


Lesenswert?

Typographische Anführungszeichen statt normalen verwendet.

von M.of.D (Gast)


Lesenswert?

Hallo Olli,

ich habe mal testweise die SQL-Werte als Jpgraph dargestellt, nach ein 
paar hin und her hat es dann auch funktioniert. Ich verwende ein 
abgeändertes Skript von Häussler.

Jetzt kann ich dir nicht viel weiterhelfen, weil mir das Skript in der 
Arbeit nicht zur Verfügung stellt. Aber daheim werde ich mal schauen, 
wenn es die Zeit zulässt.

Gruß
Stefan

von M.of.D (Gast)


Angehängte Dateien:

Lesenswert?

Hier meine Skript-Datei.

Die musst du noch ein bisschen für dich anpassen mit den Variablen und 
so.

von Olli (Gast)


Lesenswert?

Hallo  M.of.D,

vielen Dank für dein Script!!
Kannst Du mir sagen, wie ich diesen Teil abändern muss, damit ich nur 
die ersten zwei Felder aus meiner SQL auslesen kann und als JPGraph 
anzeige?


$query = "SELECT UNIX_TIMESTAMP(dattim),aussen,keller FROM home WHERE 
dattim >= Date_Sub(Curdate(), Interval 1 day) ORDER BY dattim";
$result = mysql_query($query);

$i=0;
while ($array=mysql_fetch_array($result)) {
   $datax[$i]=  $array[0];
   $adata[$i] = $array[3]; // keller
   $bdata[$i] = $array[1]; // aussen
   $i++;
};

Meine SQL hat insgesamt 10 Felder. Man kann doch bestimmt auch nur 
bestimmte Felder auslesen?!
Gruss
Olli

von M.of.D (Gast)


Lesenswert?

Guten Abend,

du musst genau nur diese Zeile immer ändern:
1
$query = "SELECT UNIX_TIMESTAMP(dattim),aussen,keller FROM home WHERE

das andere mit den $datax usw. ist die Variablen Übergabe zu jpgraph

von Olli (Gast)


Lesenswert?

Hallo  M.of.D,

entschuldigung wenn ich doof nachfrage, aber was muss ich da genau 
reinschreiben. Meine SQL nennt sich home und die einzelnen Einträge 
(Felder)sind: keller und aussen.
Gruss
Olli

von didadu (Gast)


Lesenswert?

Du musst die Nummern noch anpassen

Bei dem Abruf der Zeilen der SQL-Tabelle werden so viele Felder 
zurückgegeben, wie im SELECT statement angegeben sind.

Du rufst 3 Felder ab: die Timestamp, dann die zwei Felder. Macht 3 
Stück.

Das Array zählt von 0. Drei Stück, macht 0, 1, 2. Das muss dann auch in 
den [] der array in der while-Schleife stehen.

von Olli (Gast)


Lesenswert?

Wird denn UNIX_TIMESTAMP(dattim) automatisch generiert? Ich habe wie 
gesagt nur 2 Felder. Keller und aussen.
Würde das: $query = "SELECT aussen,keller FROM home WHERE" vom Syntax 
b.z.w. zum aufrufen von JPGraph, richtig sein? Damit er darus eine 
Grafik macht?
Olli

von didadu (Gast)


Lesenswert?

Wenn Deine Tabelle wirklich nur die Spalten "aussen" und "keller" hat, 
kann die Software selbst nicht wissen, zu welchem Zeitpunkt die Daten 
generiert wurden.

UNIX_TIMESTAMP(dattim) ist eine FUNKTION, die aus dem FELD (oder der 
SPALTE) dattim, das sich in der Tabelle befindet (bzw. befinden muss, 
damit das funktioniert), die Unix-Timestamp berechnet.

Natürlich kann die Funktion keine Timestamp erfinden, wenn sie nicht 
vorhanden ist, sie konvertiert nur von einem Format in ein anderes. Wenn 
Deine Tabelle also keine Spalte mit dem Namen dattim hat, dann geben die 
genannten Statements Fehler.

Wenn Du keine Timestamp gespeichert hast, dann bleibt als X-Wert für die 
Grafik nur noch eine Nr. des Datensatzes.

Vielleicht würde es so funktionieren:

$query = "SELECT aussen, keller FROM home;
$result = mysql_query($query);

$i=0;
while ($array=mysql_fetch_array($result)) {
   $datax[$i]=  $i;
   $adata[$i] = $array[0]; // aussen
   $bdata[$i] = $array[1]; // keller
   $i++;
};

von M.of.D (Gast)


Lesenswert?

Hallo,

bis jetzt funktioniert das mit dem Auslesen der RS232 und das Schreiben 
in die MySQL-DB immer noch nicht.

Mir würde auch ein anderer Lösungsweg reichen, nicht nur PHP, hauptsache
es läuft unter XP und mit einem OpenSourceCode.

Grüße
Stefan

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.