Ich suche nach einer Möglichkeit, mit dem seriellen RS232-COM-Port unter Windows zu kommunizieren. Ich habe 2 Lösungen im Internet gefunden, eine , die nicht völlig frei ist (führt absichtliche Verzögerungen bei der Funktion ein) und ein anderes mit eingeschränkten Funktionen unter Windows. Letzteres kann nur unter Windows auf einen COM-Port schreiben, nicht lesen.
Ich kann den Code der ersten Lösung nicht betrachten, da er in eine .dll kompiliert wird (macht Sinn, sonst können Leute die Verzögerung nur bearbeiten und nicht kaufen ...) und die zweite scheint nur zu benutzen fopen (), um den Port zu öffnen und später fwrite () zum Schreiben, genau wie man es bei einem Stream tun würde. Aber anscheinend frißt es nichts zurück.
Ich weiß, dass es möglich ist, wie die erste Lösung es getan hat, obwohl es Apache erfordert, php-cgi-Modul anstelle von php5module zu verwenden.
Irgendwelche Ideen?
Jede obige Lösung ist entweder ineffizient oder zu viel Arbeit.
Sie können einfach die PHP-DIO-Bibliothek verwenden (dio_fcntl, dio_open, dio_read, dio_write, dio_seek , ...). Es ist auch in dem PHP-Handbuch Eintrag für DIO :
Dieses PECL-Paket ist standardmäßig nicht verfügbar. Um es für Windows zu bekommen, wenn Sie PHP 5.2.x größer als 5.2.6 haben, können Sie es als Teil eines ZIP herunterladen:
Diese beiden Links wurden in Ссылка
gefundenHier ist der Build von Linux , hol es dir einfach und mach das phpize / configure / make / make install Ding.
Ich weiß nicht, ob es in einer Apache-Sitzung verwendet werden sollte, aber gehen Sie dafür vor.
Der einfachste Weg, dies anzugehen, wäre, ein Programm in einer anderen Sprache (wie C ++) zu schreiben und es dann von Ihrem PHP-Skript mit system()
auszuführen. Doing Comm I / O in C ++ ist trivial.
Dies setzt voraus, dass Sie genügend Zugriff auf den Server haben, um ihn so zu konfigurieren, dass die ausführbare Datei von PHP usw. ausgeführt werden kann.
Eine andere Möglichkeit wäre, die Win32-API über so etwas wie w32api_register_function()
oder ffi und dann serielle Kommunikationsanrufe
Ich hatte das selbe Problem und dachte bereits darüber nach, meine eigene PHP-Erweiterung zu schreiben, als ich auf diese Lösung stieß, die bei Arduino-Entwicklern sehr beliebt ist - "serproxy" (fand sie an vielen Stellen, dh Ссылка ) richtet einen tcp-Stack zu / von den seriellen Ports ein und erlaubte mir, die PHP-Socket-Funktionen zu benutzen, um damit zu kommunizieren.
Sie müssen die com mit einem DOS-Befehl wie like:
setzen %Vor%Der nächste Befehl führt den DOS-Befehl über php:
aus %Vor%Erstellen Sie die Ressourcen-ID:
%Vor%Schreiben an Port:
%Vor%Von Port lesen:
%Vor%Vielleicht hilft mir jemand mit dem fgets Problem. Es stapelt sich dort für genau eine Minute, wenn TO = on oder stapelt es dort für immer wenn TO = aus. Es scheint eine "MODE COM" -Option zu sein, vielleicht kann ein DOS-Experte helfen.
Vielleicht statt fgets, sollte man fgetc verwenden, da fgets bis zum Zeilenende einfängt. Wenn keine neue Zeile gefunden wird, kann sie blockiert werden, bis der Puffer leer ist. Die Verzögerung von einer Minute kann sein, dass Windows seinen Puffer in einem Intervall löscht.
Eine andere Option ist die Verwendung eines Objekts über ActiveX in Windows. Es gibt mehrere, meist kommerzielle serielle Objekte für COM unter Windows. Sie können auch ein .Net-basiertes Objekt verfügbar machen und es für die COM-Verwendung registrieren. Das setzt natürlich voraus, dass Sie die Kontrolle über den Server haben, um ein COM-Steuerelement zu registrieren, da Sie eine serielle Schnittstelle benötigen würden.
Ein weiteres Problem ist der Ressourcenkonflikt, wenn dies für die Verwendung über das Web vorgesehen ist. Wenn dies beispielsweise für einen seriellen Drucker gilt, wäre ein Druckwarteschlangenmanager die beste Option für die direkte Kommunikation.
Wenn Sie mit com-Port mit sms umgehen wollen, dann ist hier das berühmteste php serielle Kommunikation Klasse von Rémy Sanchez mit Google Beispielcode . Hier ist ein Thread , der dieses Thema enthält.
>Tags und Links php communication serial-port