2009-03-09 24 views
7

Estoy buscando una forma de comunicarse con el puerto COM serie RS232 en Windows. He encontrado 2 soluciones en la red, one que no es totalmente gratis (introduce retrasos deliberados en la función) y another con capacidad limitada en Windows. Este último solo puede escribir en un puerto COM en Windows, no leerse.Comunicaciones en serie con PHP en Windows

No puedo ver el código de la primera solución ya que está compilada en .dll (tiene sentido, de lo contrario las personas pueden simplemente editar el retraso y no comprarlo ...) y el segundo parece solo utilice fopen() para abrir el puerto y luego fwrite() para escribir, tal como lo haría con una transmisión. Pero al parecer frecuentar no devuelve nada.

Sé que es posible como la primera solución, aunque requiere que Apache use el módulo php-cgi en lugar de php5module.

¿Alguna idea?

+0

¿Está seguro de que fread() no devuelve nada? En Windows, los puertos COM son solo archivos con nombre especial, IIRC. Quizás necesite configurar los parámetros del puerto, como paridad, baud, etc., que pueden ser imposibles a través de PHP. – rmeador

Respuesta

8

Cada solución anterior es ineficaz o demasiado trabajo.

Puede usar simplemente el PHP-DIO library (dio_fcntl, dio_open, dio_read, dio_write, dio_seek, ...). También está en the PHP manual's entry for DIO:

Este paquete PECL no está disponible por defecto. Para conseguirlo para Windows si tiene PHP 5.2.x superior a 5.2.6, se puede descargar como parte de una postal:

Tanto de estos enlaces se encontraron en http://www.deveblog.com/index.php/download-pecl-extensions-for-windows/

Here is the build from Linux, simplemente obténgalo y haga lo de phpize/configure/make/make install.

No sé si debería usarse en una sesión de Apache, pero hazlo.

+1

¡Oh, dónde estabas cuando pregunté esto hace años! Aceptando esta respuesta. – syaz

4

La manera más fácil de abordar esto sería escribir un programa en otro idioma (como C++) y luego ejecutarlo desde su script php con system(). Hacer Comm I/O en C++ es trivial.

Esto supone que tiene suficiente acceso al servidor para configurarlo para permitir el ejecutable para ser ejecutado por PHP, etc.

+1

Recomiendo que desarrolles tu programa de comunicación como una biblioteca PHP para que se integre directamente con tu código PHP. Usar system() para llamar y ejecutable externo es una solución subóptima. – rmeador

+2

Estoy de acuerdo, pero para mí eso ya no cae bajo "la manera más fácil" y se convierte en "la mejor manera". :-) – SoapBox

1

Otra opción es usar un objeto a través de ActiveX en Windows. Hay varios objetos seriales, en su mayoría comerciales, para COM en Windows. También puede exponer un objeto basado en .Net y registrarlo para uso COM también. Por supuesto, esto supone que tiene control en el servidor para registrar un control COM, ya que necesitaría una interfaz en serie.

Otro problema es la contención de recursos si esto se utiliza en la Web. Si esto es para una impresora en serie, por ejemplo, entonces un administrador de colas de impresión sería su mejor opción en lugar de la comunicación directa.

3

Es necesario configurar el comunicador con un comando del DOS como como:

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

El siguiente comando ejecuta los comandos de DOS a través de php:

echo"$output"; 

Crear el ID de recurso:

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

if(!$fp){ 

echo"Port not accessible"; 

}else{ 

echo"Port COM1 opened successfully"; 

} 

Escribir al puerto:

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

echo"Bytes written to port: $writtenBytes"; 

Leer del puerto:

$buffer = fgets($fp); 

echo"Read from buffer: $buffer"; 

Tal vez alguien me ayude con el problema fgets. Se apila allí durante exactamente un minuto si TO = encendido o se acumula allí para siempre si TO = apagado. Parece ser una opción "MODE COM", por lo que quizás un experto en DOS pueda ayudar.

Quizás en lugar de fgets, uno debería usar fgetc, ya que fgets captura a través de la nueva línea. Si no se encuentra una nueva línea, puede bloquear hasta que haya una o hasta que se vacíe el búfer. La demora de un minuto puede ser que Windows descargue su búfer en un intervalo.

3

que tenían el mismo problema y ya considerado escribir mi propia extensión php cuando me encontré con esta solución, que es popular entre los desarrolladores de Arduino - 'serproxy' (. Encontrado en muchos lugares, es decir http://www.lspace.nildram.co.uk/freeware.html) establece una pila TCP a/de los puertos serie y me permitió usar las funciones de socket php para comunicarme con él.

1

Si desea tratar con sms utilizando el puerto com, aquí está el más famoso php serial communication class by Rémy Sanchez con google sample code. Here is a thread que incluye ese tema.

+2

Tenga en cuenta que [se desaconsejan las respuestas de solo vínculo] (http://meta.stackoverflow.com/tags/link-only-answers/info), las respuestas SO deberían ser el punto final de una búsqueda de una solución (vs. otra escala más de referencias, que tienden a quedar obsoletas en el tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia. – kleopatra

+0

Gracias @kleopatra por la guía! – adi

Cuestiones relacionadas