Hallo zusammen, Immer wieder stellt sich die Frage, wie man eine mikrokontrollerbasierte Schaltung an das Internet "anschließen" kann. Da die meisten Mikrokontroller per serieller Schnittstelle mit der Außenwelt kommunizieren, scheint die Anbindung der seriellen Schnittstelle (RS232) ans Internet eine spannende Option zu sein. Es gibt hierbei eine menge Möglichkeiten. Eine Möglichkeit ist durch so genannte CGI Programme gegeben, die auf dem Server liegen und dann durch einen Browseraufruf eines Clients gestartet werden. Diese Programme werden meist mit c geschrieben. Da ich im Rahmen eines kleineren Projekts auf CGI Programme verzichten wollte und hierbei auf die simple und höchst flexible Sprache PHP zurückgreifen wollte, recherchierte ich im Netz nach Möglichkeiten die serielle Schnittstelle per PHP anzusprechen. Nach längerer Suche entdeckte ich hie und da Codeschnipsel die aufzeigten wie so etwas geht. Da diese Suche recht mühsam war und ich denke, dass auch andere Leute Interesse an dieser Option haben könnten, stelle ich die Lösung mal hier ins Netz. Nach längerer Herumprobiererei hatte ich alles zusammen und packte die Erkenntnisse in 2 kleine Funktionen: Eine zum Senden und eine zum Empfangen. Am Schluss zeige ich beispielhaft einen Aufruf dieser Funktionen. Hinweis: Es kann selbstverständlich nur die serielle Schnittstelle des Servers angesprochen werden! Für einen Zugriff auf die Schnittstelle eines Clients hat man keine Zugriffsrechte! <?php //Funktion zum Einstellen der seriellen Schnittstelle function rs232init($com,$bautrate) { `mode $com: BAUD=$bautrate PARITY=N data=8 stop=1 xon=off`; } //Funktion zum Senden function senden($comport,$zeichen) { $fp = fopen ("$comport", "w+"); if (!$fp) { echo "Port zum Schreiben nicht geöffnet!"; } else { fputs ($fp, $zeichen); fclose ($fp); } } //Funktion zum Empfangen function lesen($comport2,$sekunden) { $buffer = ""; $fp2 = fopen ("$comport2", "r+"); if (!$fp2) { echo "Port zum lesen nicht geöffnet"; } else { sleep($sekunden); $buffer .= fgets($fp2, 4096); } return $buffer; fclose ($fp2); } // Beispielaufrufe rs232init(com2,"9600"); // Com2 öffnen mit Bautrate 9600 Baut senden(com2,"hallo"); // den Text “Hallo” auf den comport 2 schreiben $lese = lesen(com2,"2"); // 2 Sekunden lang Daten von Comport2 empfangen und in die Variable $lese schreiben echo $lese; „“ //Variable $lese ausgeben ?>
ah ich sehe grade das bei den Beispielaufrufen die Anführungsstrichelchen bei com2 fehlen. also "com2" schreiben beim Funktionsaufruf.
nur ein paar infos am rande......... http://www.mikrocontroller.net/articles/Ports_benutzen_%28PHP%29 da hab ich das ganze vor einiger zeit mal beschrieben.. zumindest unter linux gehts so http://www.mikrocontroller.net/articles/Ports_benutzen_%28Windows%29 da ist das windows-zeugs beschrieben... zumindest kann mans so für alle ports machen.. für die rs232 gibts extra funktionen zum initialisieren.. habe ich hier im forum irgendwann mal schon beschrieben... ob ein fopen("com1") wirklich immer geht bezweifle ich... lieber fopen("\\.\com1")... zumindest meint das die knowledge-base von m$ Schnittstellen-initialisierung unter posix habe ich oben beschrieben.. wie das unter windows eleganter geht weis ich nicht... 73
Danke, ein sehr interessanter Beitrag!!! Wenn ich mit einem yC digitale Ausg. schalten will, wie mache ich die Übertragung per seriell? (Hardwaremäßig ist mir das klar, wie ich zb. von RS232 auf UART komme...) Ich meine, werde ich dann einfach ein Byte senden, in dem die Informationen als einzelne Bits gesendet werden, die ich dann auf einen(oder von mir aus auch mehrere) Ports schreibe? Oder habe ich mit nem yC auch die Möglichkeit, strings zu vergleichen? Geht sowas mit C? dann brauche ich bestimmt entsprechende Headers oder?
Funktioniert das mit dem ansteuern der schnittstelle auch mit xammp unter windows? habe es grade versucht, hat irgendwas noch nicht geklappt. was genau muss ich denn an dem code noch verändern um comport3 anzusprechen. außerdem verstehe ich nicht an welcher stelle $comport und $zeichen als eine variable bestimmt wurden? mfg
mhh bei mir krieg ichs einfach nicht zum laufen.. jedesmal Permission denied... muss ich evtl irgendwelche Rechte setzen, dass ich überhaupt auf die rs232 zugreifen kann?
Eine Firma (www.ajaxup.com) hat einen Proxy geschrieben, der einen Socket auf RS232 umleitet. Ja. man kann das auch selbst schreiben, aber bis man irgendwie komfortabel arbeiten kann geht doch einige Zeit weg. Ich hab dann einen Webserver fuer einen Atmel gescrieben, der ueber die serielle Schnittstelle laeuft. Im wesentlichen geht es darum, auf GET Anfragen des Browsers mit einer Webseite zu antworten. In 95% aller Faelle ist eine Ethernetanbindung Overkill.
Ohje ich versteh nur Bahnhof.. ich hab nur ein paar PHP und C Kenntnisse. Eigentlich will ich am MC eine Temperatur auswerten und diese dann über UART an die RS232 schicken (funktioniert schon) Nun will ich diese irgendwie in php reinkriegen das ich ne kleine page machen kann auf denen die aktuellen Temperaturen ausgegeben werden.. am besten möglichst unkompliziert. =)
Ich suche immernoch, hab mittlerweile gefühlte 5000 Seiten durch und den Code in zig abgewandelten Varianten wiedergefunden, es gibt sogar Leute bei denen es auch nicht funktioniert, aber eine vernünfige Antwort woran es liegt hab ich bis jetzt noch nicht gelesen.. was ne Schei*e
PHP ist serverseitig. Da ist nichts mit schicken, sondern eher mit abholen, beim Server. Du benoetigst einen Webserver, der die Anfragen an einen Server auswertet und dabei die gewuenschten Daten zurueckliefert.
Hallo zusammen, ich habe den Code bislang nur auf einem Rechner laufen gehabt. Dort hat der Code funktioniert. Ich benutze einen USB-->RS232 Wandler. Ob das einen Unterschied zur konventionellen RS232 macht, weiß ich allerdings nicht. Ferner nutze ich den Apache Webserver den es als XAMPP Komplettpacket gibt. Warum der Code teilweise bei anderen Leuten nicht funktiniert weiß ich nicht. Diese Frage konnte auch im Laufe einiger Diskussionen nicht gelöst werden. Wenn jemand eine eindeutige Antwort hat, wäre das natürlich toll wenn er die hier posten könnte (würde mich sehr interessieren). Wenn PHP nicht funktioniert bietet sich die Programmierung eines CGI-Programmes an, welches dann die RS232 abfragt. Das habe ich jedoch bislang noch nicht gemacht. Das CGI Programm entspricht einer EXE Datei, die in ein entsprechendes Verzeichnis des Webservers kommt und dann aufgerufen wird. Kann man mit C++, VB oder so programmieren. Gruß Jonny
Es funktioniert warscheinlich wegen der Berechtigung der RS232 Schnittstelle nicht, entweder der Webserveruser muß als Gruppe berechtig sein, die Schnittstelle zu benutzen, oder es muß ein chown auf den Webbenutzer gemacht werden.
@ uzfg, wie kann ich dem Server denn beibringen, dass er die Berechtigung hat auf die RS232 zuzugreifen? Ich nutze Windows XP.
@vielleicht so Das ist soweit klar, meine Idee ist folgende: Im Keller will ich die Temperaturen von Heizung, Solarkollektoren usw. aufnehmen (mit dem MC) Die einzelnen Temperaturwerte wollte ich dann an die serielle Schnittstelle schicken. (möglicherweise an einen Server im Keller). Die Daten die ich aufnehme wollte ich über eine Hausinterne "Homepage" allen zugänglich machen, soweit der Plan, bin natürlich immer offen für andere Ideen. Diese lag nur nahe weil ich schonmal ein bischen was in PHP gemacht habe und ich es für eine gute Möglichkeit halte die Daten quasi zu verteilen. @Jonny Vielleicht liegt es auch an der PHP-Version bzw. der des Xammp oder die Rechte die Xampp hat um auf irgendwas zuzugreifen, das hab ich in nem anderem Forum aufgeschnappt (natürlich gabs da auch keine Lösung) @all die Suchen Evtl. könnte auch dies eine Alternative sein: http://www.easyvitools.com/phpserial/index.html "This is a loadable extension for PHP running on Windows implementing serial port handling and communications. Once installed in PHP environment you can programm PHP applications to control serial device hosted on server from remote location; these devices can be anything from video switcher, cameras pan/tilt, ham radios, media players, home automation boxes, GSM modems/terminals (send/receive SMS), only your imagination and needs are the limits." hierbei handelt es sich um eine PHP-Erweiterung, so daß man über Funktionen auf die Schnittstelle zugreifen kann. Habs aber noch nicht ausprobiert..
JA JA JA!!! Ein erster Erfolg... ich empfange was, zwar ein großer Haufen Scheisse und Zeichen aber immerhin in einer Reihenfolge ;)... aber woran kann das nun wieder liegen? ich schicke einfach einzelne Zeichen A-Z 1-9 und mit der Funktion nehm ich nen string auf von 512 zeichen...
> ich schicke einfach einzelne Zeichen A-Z 1-9 und mit der > Funktion nehm ich nen string auf von 512 zeichen... Hat dein Mikrocontroller genug RAM? 512 Zeichen belegen immerhin mindestens 512 Bytes, dein Controller sollte also wenigstens 1kB RAM besitzen.
also ich hab nur so einen codeschnippsel mit dem man einzelne chars schicken kann.. und das mach ich halt immer nacheinander.. hab mal ein bischen rumgetestet.. das einzige was ich rausfinden konnte ist das wenn das serielle kabel nicht eingestöpselt ist auch nichts ankommt.. hmm weiss nicht so richtig wo ich ansetzen sollte hab mir die codes zusammengeklaut.. hilft nichts, muss ich mich möglicherweise doch mit befassen ;)
Es gibt für PHP auch noch die dio-Erweiterung (http://de2.php.net/dio). Damit wirds zumindest unter Linux einfacher die serielle Schnittstelle anzusprechen, obs auch unter Windoof läuft, weiss ich allerdings nicht. Hier mal ein Beispiel: $fd = dio_open('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK); dio_fcntl($fd, F_SETFL, O_SYNC); dio_tcsetattr($fd, array('baud' => 9600, 'bits' => 8, 'stop' => 1, 'parity' => 0)); $Sende="Dies ist ein Test"; dio_write($fd,$Sende); dio_close($fd); Lesen geht entsprechend mit dio_read.
http://www.phpclasses.org/browse/package/3679.html lesen klappt mit dieser klasse gut unter windoof nur mit senden ist mühsam.. doch fast alle klassen in diesem stil bauen auf dio auf.. weiss nicht ob das in xampp mit drin ist.. musst vielleicht php neu kompilieren, mit --enable-dio http://www.php.net/manual/de/install.windows.building.php
DAS ist die Lösung für dich: http://www.easyvitools.com/phpserial/index.html (funktioniert bei mir mit nem atmel und windows super)
Hallo Eni, herzlichen Dank für den Link! Ich habe mir das Packet mal runtergeladen. Wenn ich mal Zeit finde, werde ich einen Test durchführen. Das Ganze ist auch sehr gut dokumentiert. Ist sicher für einige Leute interessant. Grüße Jonny
> JA JA JA!!! Ein erster Erfolg... ich empfange was, zwar ein großer > Haufen Scheisse und Zeichen aber immerhin in einer Reihenfolge ;)... > aber woran kann das nun wieder liegen? ich schicke einfach einzelne > Zeichen A-Z 1-9 und mit der Funktion nehm ich nen string auf von 512 > zeichen... [...] > das einzige was ich rausfinden konnte ist das wenn > das serielle kabel nicht eingestöpselt ist auch nichts ankommt.. Da muss ich doch sofort an verschiedene Baudraten bei Sender/Empfänger denken... evtl. auch andere Einstellungen zu Start-, Stop- oder Parity-Bits.
Hey Jonny, tolle Sache was du da ausgearbeitet hast! Aber ich hab da eine Frage: Sagen wir ich lasse ein PHP-Script in einem eigenen Frame rennen, das dauernd die RS232 ausliest. Nun, nach 30 Sekunden wird das Ganze sowieso abgebrochen, da ja die Max. Runtime erreicht ist und es wird auch nie Information dargestellt, weil geparst wird die Seite ja erst, NACHDEM der ganze PHP-Quellcode durchgearbeitet wurde.. Was soll ich da machen? Doch mit Java? (Frameset deswegen, damit die Leute trotzdem noch auf der Page arbeiten können. Liegt dann was am COM an, wird n <meta> gotourl ausgeführt und im URL-GET die Variable übertragen. Bitte HILLFFEEE!!! xD Lg Martin
Die Aktivitäten für die serielle Schnittstelle in kleine, kurze PHP-Blöcke zerlegen und mit einem clientseitigen JavaScript diese per XMLHttpRequest aufrufen. Dann ist kein Neuladen und auch kein Frameset erforderlich.
vielleicht so wrote: > Eine Firma (www.ajaxup.com) hat einen Proxy geschrieben, der einen > Socket auf RS232 umleitet. Ja. man kann das auch selbst schreiben, aber > bis man irgendwie komfortabel arbeiten kann geht doch einige Zeit weg. Da braucht man nix zu programmieren für, da braucht man lediglich socat auf der Kommandozeile aufzurufen... Rufus: Im Gegenzug schließt man mit dem AJAX-Gerümpel aber auch alle nicht topaktuellen Browser aus... ob das für so ne Minianwendung Sinn macht, muss man abwägen.
> Im Gegenzug schließt man mit dem AJAX-Gerümpel aber auch alle > nicht topaktuellen Browser aus... Definiere "nicht topaktuell". Gibts noch Leute, die mit Mosaic unterwegs sind? XMLHttpRequest sollten doch eigentlich alle Browser der letzten ... hmm ... fünf Jahre oder so kennen.
Internet Explorer und Firefox und Opera sind aber nicht "alle" Browser. Viele benutzen noch gerne Lynx, W3M, Links und andres konsolenbasiertes Zeugs, weils superschnell ist. Ansonsten haben (immer noch) viele JavaScript abgestellt und so weiter. Wenns nicht ABSOLUT nötig ist, lieber nen Bogen um Ajax drumrum machen...
Auweia, ist wohl doch nicht so einfach. Ich würde auch gerne auch serverseitig via PHP auf der RS232 Daten ausgeben. (Soll eine Web-Messenger werden. Infos über Webseite an LED Lauflicht). Programmieren bin ich leider nicht so fit. Gibts sonst noch Ideen? Danke joachim
1 | <?php |
2 | |
3 | exec('mode com1: baud=9600 data=8 stop=1 parity=n xon=on'); |
4 | // execute 'help mode' in command line of Windows for help
|
5 | |
6 | $fd = dio_open('com1:', O_RDWR); |
7 | |
8 | while (1) { |
9 | |
10 | $data = dio_read($fd, 256); |
11 | |
12 | if ($data) { |
13 | echo $data; |
14 | }
|
15 | }
|
16 | |
17 | ?>
|
Code von: http://www.php.net/manual/en/function.dio-tcsetattr.php
Da ich derzeit mal wieder probiere die COM-Schnittstelle über PHP anzusprechen, möchte ich hier nochmals nachfragen. Wie schon vor einigen Wochen erhalte ich wieder den selben Fehler: fopen(COM2:) [function.fopen]: failed to open stream: Permission denied Irgendwie öffnet er zwar die COM, der Browser bleibt aber hängen bzw. produziert diesen Fehler. Das Senden klappt nur das Lesen nicht. Hier mal der Code:
1 | `mode COM2: BAUD=9600 PARITY=N data=8 stop=1 xon=off`; |
2 | |
3 | $fp = fopen ("COM2:", "w+"); |
4 | |
5 | sleep(5); |
6 | |
7 | $string = fgets($fp); |
8 | |
9 | echo "Empfangen: ".$string."<br>"; |
10 | |
11 | $string = "I000"; |
12 | echo "Test: ".$string; |
13 | if (!$fp) echo "Port not opened."; |
14 | else fputs ($fp, $string ); |
15 | |
16 | fclose($fp); |
Das ist natürlich nur auf das Wesentliche beschränkt, da ich im Moment nur teste. Das komische ist, dass das Lesen auch schon mal ging. Nach einem Neuboot des PC nun aber nicht mehr. Ich habe auch schon mit den Seriell Extension von http://www.easyvitools.com herumprobiert. Damit ging es zwar, da ist aber eine lange störende Wartezeit eingebaut. Die dio Funktionen scheiden auch aus, da ich da php neu kompilieren müsste und da weis ich nicht wie das geht unter XAMPP von Windows. Falls ihr also inzwischen Lösungen gefunden habt, dann wäre ich sehr daran interessiert. Mein Vorhaben ist einfach nur über eine WEB Seite mit einem µC zu kommunizieren, welcher an der COM2: des XAMPP-Servers angeschlossen ist. Sven
Hi, ich suche gerade nach einer Lösung ein serielle Schnittstelle unter linux mit PHP abzufragen. Wenn ich den oben genannten codeschipsel von php.net benutzen möchte , dann wird exec('mode com1: baud=9600 data=8 stop=1 parity=n xon=on'); durch exec('stty -F /dev/ttyUSB0 19200'); ersetze, dann klappt das für "normale" serielle Übertragungen auch. Nur habe ich das Problem, das ich die RTS Leitung vor der kommunikation mit dem Sensor auf high setzten muß. Was leider mit stty nicht geht. Hat da jemand eine Lösung? Muß aber leider mit PHP sein, da das gesammte Heimautomatisierungsprojekt schon unter PHP-CLI läuft. Gruß Golem PS: @ Sven Stefan fopen(COM2:) [function.fopen]: failed to open stream: Permission denied das könnte daran liegen, das der apache unter Windows als user SYSTEM läuft, setze den in den Diensteeinstellungen mal auf einen Anderen Benutzer, der zugriff auf sie serielle schnittstelle hat.
Hallo, kämpfe auch gerade damit, RS-Sgnale in PHP (WIN-XP, soll später aber auch auf LINUX laufen einzulesen. Schreiben geht, aber beim Lesen gibts ein Problem: function lesen($comport7,$sekunden) { $buffer = ""; $fp2 = fopen ("$comport7", "r+"); if (!$fp2) { echo "Port zum lesen nicht geöffnet"; } else { sleep($sekunden); $buffer .= fgets($fp2, 4096); } return $buffer; fclose ($fp2); } Durch den Sleep Befehl, versetze ich die Kiste in den Schlaf, der Port wird abgehört und der Rest ist blockiert. Ich hab das früher mit VB gemacht. Dort wird einEreignis ("OnComm") ausgelöst, dan werden die Daten abgefragt und verarbeitet. Gibt'sowas irgendwie unter PHP ? Bau mir ne Hausautomation, mit Barebone PC, der mit Linux, pche und php laufen soll.
Hallo Hinrich, Unter win wirdt du da mit dem Sleep befehl nicht weit kommen, der hält die Verarbeitung wirklich so lange an, bis die zeit abgelaufen ist. Ich habe alle Module z.B. X-10 oder DMX unter Linux per fork in eigene Prozesse gepackt untereinander kommunizieren diese per Shared Memory und per User Signal kann dabei ein sleep unterbrochen werden. Das alles funktioniert unter windosw nicht.
Hi Leute, habe mir eine Extension für PHP unter Windows geschrieben mit der ich auf die Serielle Schnittstelle zugreifen kann. Dazu muss man nur die DLL in der php.ini einbinden und los gehts. php.ini
1 | extension="C:\"Pfad"\php_custom_ext.dll" |
Code in PHP
1 | $str = openRS232(1); //Rückgabe boolean, Parameter Nr. des Com Ports |
2 | |
3 | $data = readRS232(); //Lesen wenn keine Daten vorhanden kommt ETX (Ascii 3) |
4 | |
5 | closeRS232(); |
Wie man ein Extension für PHP schreibt findet ihr unter: http://devzone.zend.com/article/1021 Gerne könnt ihr die Projekt-Datei haben und noch das schreiben auf RS232 ergänzen. Einfach melden! Gruß S
Hallo RS232-Fans, wenn ich das obige lese und meine eigenen Googleleien dazu nehme, schließe ich daraus, dass es für PHP auf Windows keine standardmäßige Möglichkeit zum Lesen von der seriellen Schnittstelle gibt. Es geht nur mit einer gekauften oder selber programmierten PHP-Extension oder einem "Seriell-TCP/IP-Workarround". @eni: Ich habe auch die php_serial.class von phpclasses.org ausprobiert. Da bekommt man unter XP bei einem Leseversuch eine Fehlermeldung, siehe Quellcode:
1 | trigger_error("Reading serial port is not implemented for Windows", E_USER_WARNING); |
2 | return false; |
Schade ..., Mit freundlichen Grüßen recently
Ich würde ja generell lieber ein seperates Tool/Dienst schreiben der den RS232-Kram erledigt und die Daten in eine Datenbank schreibt, die ein php-skript dann ausliest. Dann braucht der Webserver keine Berechtigungen für den COM-Port und man hat keine Probleme wenn die PHP-Seite mehrfach aufgerufen wird.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.