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
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
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
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.
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
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
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:
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.
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
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
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
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.
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?
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
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.
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.
@ 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
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
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
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
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.
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
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++;
};
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