Hallo,
ich lese und sende mit php über die serielle Schnittstelle unter Windows
7. Das klappt auch, aber nur, wenn ich nach dem Hochfahren (oder nach
dem Anstecken des USB-Seriellwandlers (FDDI)) hterm oder ein anderes
Terminalprogramm starte, den Seriellport kurz öffne und wieder schließe.
Tue ich dies nicht, sendet das PHP-Skript zwar Daten raus, kann aber
nichts vom Comport lesen und bricht nach rund 50 Sekunden ab (obwohl der
Timeout ja 30 Sekunden beträgt).
Bevor das Skript startet, setze ich mit mode die entsprechenden
Einstellungen. Ich habe auch verglichen, was das Terminalprogramm
einstellt und den mode-Befehl entsprechend angepasst.
Woran kann das liegen?
Gibt es ein Programm, das einfach kurz einen Comport öffnet und wieder
schließt, damit ich das Problem so umgehen kann?
Gruß,
chris
Chris schrieb:> Bevor das Skript startet, setze ich mit mode die entsprechenden> Einstellungen. Ich habe auch verglichen, was das Terminalprogramm> einstellt und den mode-Befehl entsprechend angepasst.
es kann eigentlich nur eine einstellung sein die du vergisst zu setzen.
Ich finde das Konzept aber sehr schlecht. Ein php-Script wird für jeden
Abfrage neu ausgeführt, was ist wenn jetzt 2 Anfrangen gleichzeit
reinkomen? Ein COM port kann man nur einmal öffnen.
Soetwas sollte man mit einer echten Webanwendung (ASP, JAVA) machen,
dabei übernimmt ein Thread die steuerung der Schnittstelle und die
webrequest arbeiten dann mit diesem Server teil.
Das ganze besteht auch aus 2 "Threads". Der eine wird mit dem
Windows-Taskplaner ausgeführt, holt die Daten ab, prüft die
Wertebereiche, String-Längen usw, schreibt in die DB und quittiert den
Empfang, um den Datensatz von der Mikrocontroller-Platine zu löschen
bzw. als "übertragen" zu markieren.
Auf der Platine gibt es nebenbei noch eine SD-Karte. Wenn der Puffer mit
den Logdaten nicht schnell genug geholt wird (die Daten fallen rund um
die Uhr alle 4 Minuten an und der PC läuft nicht durchgehend), dann wird
auf die SD-Karte geschrieben. Der PC sieht beim Abruf nicht, ob es die
Werte der SD-Karte sind oder die aus dem Ram-Puffer des Atmegas.
Als Benutzer greift man mit einem 2. PHP-Skript auf die DB zu und lässt
sich die Werte anzeigen.
Zum Thema falsche Einstellungen:
Die Baud-Rate stimmt, denn wenn das PHP-Skript sendet, antwortet die
Platine wie erwartet (LED blitzt kurz auf und laut Logic Analyzer kommt
auch das erwartete zurück).
Nur empfängt php nix....
Chris schrieb:> Nur empfängt php nix....
Das klingt nach aktivierter HW-Flusskontrolle und nicht aktivierter
CTS-Leitung.
Also am Besten, ersteres deaktivieren.
mfG ingo
Flusskontrolle sollte aus sein:
>mode com9
Baudrate: 57600
Parität: None
Datenbits: 8
Stoppbits: 1
Timeout: OFF
XON/XOFF: OFF
CTS-Handshaking: OFF
DSR-Handshaking: OFF
DSR-Prüfung: OFF
DTR-Signal: OFF
RTS-Signal: OFF
Die Pegel auf den ungenutzten Leitung sind auch alle definiert
(gebrückt/rückgekoppelt).
Die Antwort vom Mikrocontroller kommt sofort zurück. Ich habe auch
testweise schon eine Sekunde Pause eingebaut um PHP genug Zeit zu geben,
in die "Abrufschleife" zu kommen.
Wenn ich nach dem Hochfahren kurz mal mit dem Terminalprogramm den
Seriellport öffne und schließe, funktioniert es anschließend ja auch.
Also muss durch das Terminalprogramm irgendwas passieren / umgestellt
werden. Aber was?
Nebenbei: Mit einem Prolific (oder so...) USB-Adapter habe ich das
gleiche Ergebnis.
Und wo setzt du die Schnittstellenparameter? Dein Mode definiert einfach
nur einen String den musst du dann noch irgendwem übergeben wenn mich
nicht alles täuscht.
@läubi:
Ich dachte dass der Mode-Befehl dann ausgeführt wird, wobei ich das auch
schon mit exec("mode...."); probiert habe. Ist aber für meine Versuche
nicht von Bedeutung, da ich die Schnittstelle eh vor dem Aufruf der
php-Datei in der Batch-Datei einrichte.
@kopfkratz: Die Beiträge kenne ich schon, bis auf die Lösung mit dem
Seriell-Lan-Wandler. Dio habe ich nicht getestet da es unter Windows
nicht implementiert ist.
Ich werde das ganze mal unter Linux testen.
Chris schrieb:> Ich dachte dass der Mode-Befehl dann ausgeführt wird, wobei ich das auch> schon mit exec("mode...."); probiert habe. Ist aber für meine Versuche> nicht von Bedeutung, da ich die Schnittstelle eh vor dem Aufruf der> php-Datei in der Batch-Datei einrichte.
Wie jetzt? natürlich ist das von Bedeutung. Du solltest auf jedenfall
prüfen ob der Modeaufruf dauerhaft ist und ob eventuell Fehler
zurückgeben werden.
Also wie ist den jetzt dein genaueres Setup?
Ok, dann schildere ich nochmal, was ich jetzt hier habe:
Bat-Datei:
1) mode-Aufruf wie oben angegeben
2) php.exe abruf.php mit dem obigen Quelltext.
Lasse ich den Mode-Aufruf weg, werden Daten an die Platine gesendet
(grüne LED blinkt), aber die Platine sendet keine Antwort (rote LED
blinkt nicht).
D.h. die Platine hat die Anfrage nicht verstanden, weil die Baudrate
nicht stimmte.
Mit dem Mode-Aufruf werden Daten gesendet (grün blinkt auf) und die
Platine sendet die Messwerte zurück (rot blinkt). Also stimmt die
Baudrate nun.
Php hängt sich in der Abrufschleife auf bzw. empfängt nichts.
Starte ich ein Terminalprogramm und öffne und schließe den Port (oder
beende das Terminalprogramm), so ist es egal, ob ich danach den
Mode-Befehl ausführe oder nicht, die Einstellungen stimmen dann ja
schon.
Unterschied: Php hängt sich nicht auf, sondern liest die Daten ein.
Wenn ich nach Aufruf des Terminalprogramms mode mit z.B. einer falschen
Baudrate ausführe, reagiert die Platine nicht mehr. Wenn ich danach
nochmal mode mit den richtigen Parametern aufrufe, funktioniert es
wieder.
Hallo,
will hier keine Leichen schänden, aber ich hab exakt das selbe Problem.
WInXP, PHP 5.3. Egal ob ichs mit dio oder "simpel" mach, dass selbe.
Auch die mode einstellung überprüf ich vor dem start nochmal in der
console, tut sich aber nix. erst wenn ich einmal das comport mit hterm
aufgemacht hab, klappts. jetzt schreib ich grad das proggi in delphi, da
gehts gleich. taugt mir aber nicht so.