Frage

Ich bin auf der Suche nach einer Möglichkeit, mit RS232 seriell COM-Port auf Windows zu kommunizieren. Ich habe zwei Lösungen im Netz gefunden, ein , die nicht völlig frei ist (führt vorsätzliches Verzögerungen auf der Funktion) und anderen mit begrenzten Fähigkeit unter Windows. Letzteres kann nur an ein COM-Port unter Windows schreiben, nicht lesen.

Ich kann nicht auf den Code der ersten Lösung suchen, da sie in eine DLL kompiliert wird (macht Sinn, sonst können die Menschen nur die Verzögerung bearbeiten und nicht kaufen, es ...) und die zweite scheint nur zu verwenden, fopen (), um den Port zu öffnen und später fwrite (), um es für das Schreiben, wie man zu einem Bach tun würde. Aber anscheinend freading es gibt nichts zurück.

Ich weiß, es ist möglich, da die erste Lösung, die es tat, obwohl es Apache benötigt php-cgi-Modul statt php5module zu verwenden.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Jede Lösung oben ist entweder ineffizient oder zu viel Arbeit.

Sie können nur die PHP-DIO Bibliothek verwenden (dio_fcntl, dio_open, dio_read, dio_write, dio_seek, ...). Es ist auch in der Eintrag des PHP-Handbuch für DIO :

Dieses PECL-Paket ist nicht standardmäßig verfügbar. Um es für Windows, wenn Sie PHP 5.2.x größer als 5.2.6, können Sie es als Teil eines ZIP herunterladen:

Diese beiden Links gefunden wurden in http: // www.deveblog.com/index.php/download-pecl-extensions-for-windows/

Hier ist die Build von Linux , bekommen sie nur und tun das phpize / configure / make machen / Sache installieren.

Ich weiß nicht, ob es in einer Apache-Sitzung verwendet werden soll, sondern gehe für sie.

Andere Tipps

Der einfachste Weg, dies zu bewältigen 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 vorausgesetzt, dass Sie genug Zugriff auf den Server haben zu konfigurieren, dass die ausführbare Datei erlauben, von PHP ausgeführt werden sollte, etc.

Eine andere Möglichkeit, die Win32-API durch so etwas wie w32api_register_function() oder ffi und dann mit serielle Kommunikation ruft , um es unter Windows zu arbeiten.

Ich hatte das gleiche Problem und schon als meine eigene PHP-Erweiterung zu schreiben, als ich auf diese Lösung gekommen, die mit Arduino Entwicklern beliebt - ‚serproxy‘ (fand es an vielen Orten, dh http://www.lspace.nildram.co.uk/freeware.html ) setzt einen TCP-Stapel bis zu / von und die seriellen Ports erlaubt mir die pHP-Socket-Funktionen zu verwenden, um mit ihm zu kommunizieren.

Sie müssen den COM-Port mit einem DOS-Befehl wie einzurichten.

Zum Beispiel die folgende Zeile führt den Befehl durch php:

$output = `mode COM1: BAUD=115200 PARITY=N data=8 stop=1 XON=off TO=on`;

Um die Ergebnisse angezeigt werden können Sie:

echo "$output"; 

Erstellen Sie die Ressource-ID:

$fp = fopen('COM1', 'r+');

if (!$fp)
{
      echo "Port not accessible";
}
else
{
     echo "Port COM1 opened successfully";
}

Schreibe Port:

$writtenBytes = fputs($fp, "Hello");

echo"Bytes written to port: $writtenBytes";

Lesen von Port:

$buffer = fgets($fp);

echo "Read from buffer: $buffer";

Vielleicht kann mir jemand mit dem fgets Problem helfen. Er stapelt es genau eine Minute, wenn TO=on oder Stapeln immer dort, wenn TO=off. Es scheint eine „MODE COM“ Option zu sein, so vielleicht ein DOS-Experte helfen kann.

Vielleicht statt fgets, sollte man fgetc, da fgets Erfassung bis zur newline verwenden, während fgetc ein einzelnes Zeichen einfängt. Wenn eine neue Zeile nicht gefunden wird, kann es blockieren, bis es eine oder bis der Puffer geleert ist. Die Verzögerung von einer Minute kann Fenster seine Pufferspülung auf einem Intervall.

Eine weitere Option ist ein Objekt über ActiveX auf Windows zu verwenden. Es gibt mehrere, meist kommerzielle Serien Objekte für COM an den Fenstern. Sie können auch eine .Net basierten Objekt aussetzen und auch für COM Verwendung registrieren. Natürlich ist dies nicht vermutet Sie die Kontrolle auf dem Server, um ein COM-Steuerregister, wie Sie eine serielle Schnittstelle benötigen würden.

Ein weiteres Problem sind Ressourcenkonflikte, wenn dies für die Verwendung über das Web ist. Wenn dies für einen seriellen Drucker ist, zum Beispiel, dann wäre ein Druckwarteschlange-Manager der beste Wahl über die direkte Kommunikation sein.

Wenn Sie mit sms beschäftigen möchten COM-Port verwenden, dann ist hier die berühmteste pHP serielle Kommunikation Klasse von Rémy Sanchez mit google Beispielcode . Hier ist ein Thread , die dieses Thema enthält.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top